【发布时间】:2012-08-13 07:48:22
【问题描述】:
在我的 MVC 应用程序中:
在控制器中,我创建了一个动态类型列表,该列表存储在会话中。
然后视图会尝试访问对象,但会引发异常:'object' does not contain a definition for 'a'
代码:
// Controller
List<dynamic> myLists = new List<dynamic>();
for(int i=0; i<3; i++){
var ano = new { a='a' , b = i };
myLists.Add(ano);
}
Session["rows"] = myLists;
在我看来
// My View
foreach( dynamic row in (Session["rows"] as List<dynamic>)){
<div>@row</div> // output {a:'a', b :1}
<div>@row.a</div> // throw the error.
}
注意
- 在调试时,在监视视图中我可以看到属性/值
- 在我的情况下,我无法将列表存储在 ViewBag 中,因为我使用 ajax 调用该方法
- 我尝试使用
var、object而不是dynamic=> 结果相同 - 我认为这与 MVC 或
Razor engine无关 - 我尝试使用 aspx 视图(不是剃刀视图),结果相同
为什么我无法访问该属性,如果调试器可以看到它,我该如何解决这个问题?
【问题讨论】:
-
您能否准确发布您的控制器操作返回的结果类型?我想知道它是否是 JsonResult。
-
看,我认为你的“4”不正确;我记得在 MVC/Razor 中恰好遇到了这个问题 - 它随服务包消失了。我的猜测是,剃刀视图编译过程需要被告知“顺便说一下,你需要假装你是这里 dll 的一部分”
-
@JustinHarvey,是的,目前返回类型是 JsonResult,但在这种情况下我不在乎
-
嗨,Marc,虽然您可能是对的,但我想知道如果是这种情况,本身就是动态的 ViewBag 将如何工作?
-
@JustinHarvey ViewBag 不是常规类型 - 可访问性仅适用于反射访问。 ViewBag 本质上是一个字典的包装器。不同的规则。具体来说,ViewBag 实现了
IDynamicMetaObjectProvider
标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0