【问题标题】:Pass anonymous type as model in MVC 3 Partial View在 MVC 3 Partial View 中将匿名类型作为模型传递
【发布时间】:2015-06-02 06:15:42
【问题描述】:

我正在重构一个 MVC 3 应用程序,并将一组类似的项目移动到一个局部视图中,以便我可以保持该模板 DRY。由于这些片段并不都具有完全相同的属性,因此我正在创建这样的匿名类型:

var model1 = new { Description = "description 1", Message = "message 1" }

并将它们传递给局部视图,如下所示:

@Html.Partial("_Partial", model1)

局部视图然后尝试根据特定属性的存在来渲染某些块,即

@if (Model.Description != null) { @Model.Description }

我的问题是,即使在执行过程中我可以在监视窗口中查看和导航 Model 对象,我在 if 测试中得到一个 RuntimeBinderException 声明 'object' does not contain a definition for 'ShowApplied'。我可以通过调用 (Model.GetType().GetProperty("ShowApplied").GetValue(Model)) 通过反射获取值,但更愿意使用我的代码示例中显示的格式。我一直找不到干净的解决方案...

  1. 如何将匿名类型的对象传递给局部视图并直接访问其属性?我觉得我缺少一些简单的东西......
  2. 为什么我在调试时可以看到Model 属性,但不能从代码中访问它们?

编辑

  • 我指定@model 动态。
  • 使用接口需要创建非匿名类型,因为就像this answer explains

匿名类型不能转换为除object 之外的任何接口或类型。

【问题讨论】:

  • 你在局部视图中指定你的模型为:@model dynamic
  • @DavidTansey 我确实指定了dynamic,但没有区别
  • 您可以将部分视图绑定到界面。然后让您的各种类实现您需要的适当接口。
  • @Jasen 这可能是一个很好的解决方案;恢复 Intellisense 将是一个额外的好处。

标签: asp.net-mvc asp.net-mvc-3 parameter-passing partial-views anonymous-types


【解决方案1】:

来自 cmets 的见解(谢谢)意味着我有 2 个选择,因为(正如对链接问题的回答所指出的那样),

匿名类型是内部的,因此它们的属性不能在其定义的程序集之外看到。

因此 Razor 绑定引擎无法访问。

  1. 使用 @Html.DisplayFor("amount") 并处理没有 IntelliSense、参考查找等问题。

  2. 创建实现通用接口的类并将我的局部视图绑定到该接口。

【讨论】:

  • This article,从接受的答案链接到链接的问题,指出第三个选项 - ExpandoObject。我自己还没有尝试过,但可能会继续创建课程,而不是教我的团队有关 ExpandoObject 的知识,因为我们的所有项目都无法使用它。
  • 试用ExpandoObject 只是为了好玩 - 文章概述了对动态反射的扩展。否则View/Partial 调用会引发编译错误:System.Web.Mvc.HtmlHelper<dynamic>' has no applicable method named 'Partial' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多