将ViewBag作为参数传递

时间:2011-12-08 06:14:29

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0

如果我在动态ViewBag中有值,为什么我不能将它传递给方法?因此,为了简单起见,我要说ViewBag.SomeValue,我想将ViewBag.SomeValue传递给HTML帮助器。如果HTML帮助器接受dynamic作为变量,为什么它不接受我的ViewBag.SomeValue

@Html.SimpleHelper(ViewBag.SomeValue)

public static string SimpleHelper(this HtmlHelper html, dynamic dynamicString)
{
    return string.Format("This is my dynamic string: {0}", dynamicString);
}

3 个答案:

答案 0 :(得分:8)

正如错误消息所示,无法动态调度扩展方法。它在.NET中不受支持。它与ASP.NET MVC或Razor无关。尝试将扩展方法写入某个采用动态参数的类型,然后尝试调用此扩展方法,将其传递给动态变量,您将收到编译时错误。

考虑以下控制台应用程序示例,该示例说明了这一点:

public static class Extensions
{
    public static void Foo(this object o, dynamic x)
    {
    }
}

class Program
{
    static void Main()
    {
        dynamic x = "abc";
        new object().Foo(x); // Compile time error here
    }
}

所以你需要施放:

@Html.SimpleHelper((string)ViewBag.SomeValue)

实际上,正如Adam所说,你需要使用强类型视图模型,而不要使用ViewBag。这只是为什么不应该使用ViewBag的数百万个原因之一。

答案 1 :(得分:3)

更重要的是,由于ViewBag因使用魔术字符串作为viewbag的属性而使用起来有些不好 - 你想要发送给它的是什么。也许有更好的方法?您应该能够使用帮助程序实例通过以下方式引用它:

helper.ViewContext.Controller.ViewBag

但我不是一个使用ViewBag的人,除了Title http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

答案 2 :(得分:0)

我知道这是一个较老的问题,但是当我搜索这个问题时,它就是我的想法。

通过简单地将ViewBag列为方法中的动态,将ViewBag作为参数传递就足够了。例如,这里是我如何将ViewBag传递给我的一个帮助类进行列排序。

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag)