【问题标题】:Using 'Dynamic' to Assist Anonymous Types使用“动态”辅助匿名类型
【发布时间】:2012-01-04 15:42:01
【问题描述】:

我希望能够从我的视图中获取由相应控制器建立的匿名类型。根据this article 的说法,这种能力在 C# 4.0 中通过“动态”关键字成为可能。但是,当我尝试找到一个实际示例时,我会找到从“is possible”到“is not possible”的各种答案。

就我而言,我有一个控制器来创建它:

XElement headings = XElement.Parse(part.TagList);
var items = from heading in headings.Descendants("heading")
            select new {
                name = heading.Attribute("name").Value, 
                tags = heading.Attribute("tags").Value,
                content = shapeHelper.List() //This is a dynamic object!!!
            }; //can I add 'as dynamic;' here????

简而言之,如果没有静态类型,我的视图可以像这样简单地进入模型,那就太好了:

@{
//Currently this next line returns an error saying that 
//'object' contains no method 'Count'
int foo = Model.items.Count();  

//This 'foreach' works.
foreach(dynamic lineItem in Model.items){
  //But this does not work. Gives another "'object' has no definition for 'name'"
  <p>@lineItem.name</p>     }
}

可能吗?

【问题讨论】:

  • Justin 下面的建议应该可行。我只是倾向于厌倦在 MVC 视图中使用 dynamic 类型,因为出于某种原因,我总是不得不将我的对象转换为可用的东西(string、int 等)以避免在使用动态类型时出错视图(即使使用ViewBag)。
  • 问一个明显的 mvc-good-practices 问题 - 为什么不在这里使用视图模型(标准推荐)?为什么匿名类型成为一种要求,而不是填充的视图模型、强类型、捕获的编译时错误、不易受魔术字符串问题/错别字等影响?

标签: c# asp.net-mvc asp.net-mvc-3 dynamic anonymous-types


【解决方案1】:

不确定它是否正是您要查找的内容,但您始终可以使用ViewBag:

控制器

ViewBag.Items = from heading in headings.Descendants("heading")
                select new {
                    name = heading.Attribute("name").Value, 
                    tags = heading.Attribute("tags").Value,
                    content = shapeHelper.List()
                };

查看

ViewBag.Items.First().content;

【讨论】:

  • 你的回答暗示我也会得到与模型相同的结果——只要我不在视图中声明它的类型?我实际上使用的是 Orchard CMS(基于 MVC3 构建),所以我实际上无法访问 ViewBag - 或者至少我认为我没有。
  • 原来我的问题格式不正确;我提供的一些信息很糟糕。我已经更正了我的问题,并且了解到根本不可能使用 ViewBag.Items.First().content 语法。问题是“内容”是一个静态类型的属性,视图对此一无所知。让视图将集合中的项目转换为“动态”并没有帮助,因为匿名类型的静态类型属性与动态对象上的属性无关。在视图中使用动态对象意味着我也必须在控制器中使用动态对象(不是匿名类型)。
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2011-04-30
  • 2018-05-19
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多