5

在我的 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. 我尝试使用var,object而不是dynamic=> 相同的结果
  4. 我认为这与 MVC 或Razor engine
  5. 我尝试使用 aspx 视图(不是剃刀视图),结果相同

为什么我无法访问该属性,如果调试器可以看到它,我该如何解决这个问题?

4

1 回答 1

4

匿名类型属于internal声明它们的程序集。dynamicAPI尊重可访问性。由于值在那里(来自“// output...”),我必须得出结论这是一个可访问性问题。razor/MVC3 的IIRC早期版本在这种情况下确实存在问题,尽管从内存中该问题消失了其中一个服务包 - 您可能想要检查您是否是最新的 razor / MVC3 / .NET / VS补丁。但是,这里最简单的解决方法是声明一个适当的 POCO 类:

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

并使用它而不是匿名类型。这也意味着您不需要使用dynamic,这在此处是不必要且过大的。

于 2012-08-13T07:58:32.120 回答