如果我在动态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);
}
答案 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)