无法使用 [] 将索引应用于“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】:

ViewBagViewData 似乎可以互换,但是对于如何访问其中的数据有不同的规则。当您尝试索引到 ViewBag 时会弹出您的问题,这不起作用。

对于ViewBag,您使用点取消引用项目,如下所示。

ViewBag.MyItem

但是,使用ViewData,您可以通过像这样从键值字典中索引适当的键来访问项目。

ViewData["MyItem"]

【讨论】:

以上是关于无法使用 [] 将索引应用于“System.Dynamic.DynamicObject”类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章

无法将带有 [] 的索引应用于“type”类型的表达式

避免将函数应用于索引列

无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable<> 类型的表达式

将索引应用于 Blob/Longtext 字段

如何将函数应用于日期索引的 DataFrame

如何将 [] 索引应用于“ISession”类型的表达式?