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

时间:2012-08-13 07:48:23

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0

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

注意

  1. 在调试时,在观察视图中,我可以看到属性/值
  2. 我无法在我的案例中将列表存储在ViewBag中,因为我使用了ajax来调用方法
  3. 我尝试使用varobject代替dynamic =&gt;相同的结果
  4. 我认为这与MVC或Razor engine
  5. 无关
  6. 我尝试使用aspx视图(不是剃须刀)和相同的结果
  7. 为什么我无法访问该属性,如果调试器可以看到它,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:4)

匿名类型是声明它们的程序集的internaldynamic API 尊重辅助功能。由于值存在(来自“// output ...”),我必须得出结论,这是一个可访问性问题。 IIRC早期版本的剃刀/ MVC3存在完全这种情况的问题,尽管从内存中问题随着其中一个服务包而消失 - 你可能想要检查你是否与剃须刀保持同步/ MVC3 / .NET / VS补丁。但是,这里的最简单的修复方法是声明一个合适的POCO类:

public class MyViewModelType {
    public char A {get;set;}
    public int B {get;set;}
}

并使用它而不是匿名类型。这也意味着你不需要使用dynamic,这在这里是不必要的和过度的。