无法使用 [] 将索引应用于“System.Dynamic.DynamicObject”类型的表达式
Posted
技术标签:
【中文标题】无法使用 [] 将索引应用于“System.Dynamic.DynamicObject”类型的表达式【英文标题】:Cannot apply indexing with [] to an expression of type 'System.Dynamic.DynamicObject' 【发布时间】:2014-01-09 18:54:45 【问题描述】:当我尝试为 ViewBag 赋值时,出现以下错误:
无法将带有 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式
我的代码如下:
public ActionResult Success()
ViewBag["SuccessBody"] = TempData["successBody"];
return View();
PS:你可能会问我为什么这样做?因为我正在重定向到 Success 操作,并且我需要在重定向中持续存在的东西。然后,我将值分配给 ViewBag 以便将值传递给“共享”视图。
【问题讨论】:
但是您可以只使用 TempData。它会在一次重定向后存活。 是的,但不幸的是共享视图不支持 TempData 对象。 您使用什么版本的 Visual Studio 来编译这段代码? 我使用的是 Visual Studio 2012,upd4。 【参考方案1】:你试过了吗
ViewBag.SuccessBody = TempData["successBody"];
【讨论】:
就是这样!谢谢先生。 不能使用索引器的原因是什么? DynamicObjects 不会将其子对象直接公开为数组。这就是它的设计方式。 msdn.microsoft.com/en-us/library/… 啊,我明白了,很容易错过。那么ViewBag
可以将它们作为动态属性访问,而ViewData
可以通过索引器访问它们?
是的,Viewdata 是一个 ViewDataDictionary,它实现了 IDictionary 接口。这就是您可以在其上使用索引器的原因。【参考方案2】:
ViewBag 是 ViewData 的动态包装器,所以这两条语句是一样的:
ViewBag.SuccessBody = TempData["successBody"];
ViewData["SuccessBody"] = TempData["successBody"];
【讨论】:
【参考方案3】:ViewBag
和ViewData
似乎可以互换,但是对于如何访问其中的数据有不同的规则。当您尝试索引到 ViewBag
时会弹出您的问题,这不起作用。
对于ViewBag
,您使用点取消引用项目,如下所示。
ViewBag.MyItem
但是,使用ViewData
,您可以通过像这样从键值字典中索引适当的键来访问项目。
ViewData["MyItem"]
【讨论】:
以上是关于无法使用 [] 将索引应用于“System.Dynamic.DynamicObject”类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章
无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable<> 类型的表达式