【问题标题】:Retrieve property from a dynamic object after storing/retrieving it From the Session从会话中存储/检索后从动态对象中检索属性
【发布时间】: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.
}

注意

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


【解决方案1】:

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

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

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

【讨论】:

  • 很好的回答马克。但我想知道ViewBag 是如何工作的? ViewBag 也是动态的吧?
  • @Mohayemin ViewBag 不是常规类型 - 可访问性仅适用于反射访问。 ViewBag 本质上是一个字典的包装器。不同的规则。具体来说,ViewBag 实现了IDynamicMetaObjectProvider
  • 谢谢马克,在实际情况下,类型更复杂,我有很多类型,我想知道是否可以在不使用预定义类的情况下解决这个问题
  • 我记得,有一次我读到ViewBag 实际上包裹了ViewData
  • @Ahmad 你试过更新到最新版本的 Razor、MVC、VS、.NET 吗?
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 2021-12-28
  • 2013-09-03
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多