存储/检索动态对象后,从动态对象中检索属性
在我的MVC应用程序中:
在控制器中,我创建了一个动态类型列表,它存储在会话中。 然后视图尝试访问对象,但它抛出exception: 'object' does not contain a definition for 'a'
代码 :
// Controller List myLists = new List(); 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)){ @row // output {a:'a', b :1} @row.a // throw the error. }
注意
- 在调试时,在监视视图中,我可以看到属性/值
- 在我的情况下,我无法将列表存储在ViewBag中,因为我使用ajax来调用该方法
- 我尝试使用
var
,object
而不是dynamic
=>相同的结果 - 我认为这与MVC或
Razor engine
无关 - 我尝试使用aspx视图(不是剃刀)和相同的结果
为什么我无法访问该属性,如果调试器可以看到它,我该如何解决这个问题?
匿名类型是声明它们的程序集的internal
类型。 dynamic
API 尊重可访问性 。 由于值存在(来自“// output …”),我必须得出结论,这是一个可访问性问题。 IIRC早期构建的razor / MVC3确实存在一个问题,尽管从内存中问题随着其中一个服务包而消失 – 你可能想要检查你是否与razor / MVC3 / .NET / VS保持同步补丁。 但是,这里最简单的解决方法是声明一个合适的POCO类:
public class MyViewModelType { public char A {get;set;} public int B {get;set;} }
并使用它而不是匿名类型。 这也意味着你不需要使用dynamic
,这在这里是不必要的和过度的。