存储/检索动态对象后,从动态对象中检索属性

在我的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. }

注意

  1. 在调试时,在监视视图中,我可以看到属性/值
  2. 在我的情况下,我无法将列表存储在ViewBag中,因为我使用ajax来调用该方法
  3. 我尝试使用varobject而不是dynamic =>相同的结果
  4. 我认为这与MVC或Razor engine无关
  5. 我尝试使用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 ,这在这里是不必要的和过度的。