【问题标题】:Cannot apply indexing with [] to an expression of type 'System.Dynamic.DynamicObject'无法使用 [] 将索引应用于“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。

标签: c# asp.net-mvc viewbag dynamicobject


【解决方案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"]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多