Asp.net mvc 在MVC 3部分视图中将匿名类型作为模型传递
我正在重构一个MVC 3应用程序,并将一组类似的项目移动到一个局部视图中,这样我就可以保持模板干燥。由于这些片段的属性并不完全相同,因此我创建了如下匿名类型:Asp.net mvc 在MVC 3部分视图中将匿名类型作为模型传递,asp.net-mvc,asp.net-mvc-3,parameter-passing,partial-views,anonymous-types,Asp.net Mvc,Asp.net Mvc 3,Parameter Passing,Partial Views,Anonymous Types,我正在重构一个MVC 3应用程序,并将一组类似的项目移动到一个局部视图中,这样我就可以保持模板干燥。由于这些片段的属性并不完全相同,因此我创建了如下匿名类型: var model1=new{Description=“Description 1”,Message=“Message 1”} 并将其传递给局部视图,如下所示: @Html.Partial(“\u Partial”,model1) 然后,局部视图尝试基于特定属性的存在来渲染某些块,即 @if(Model.Description!=null
var model1=new{Description=“Description 1”,Message=“Message 1”}
并将其传递给局部视图,如下所示:
@Html.Partial(“\u Partial”,model1)
然后,局部视图尝试基于特定属性的存在来渲染某些块,即
@if(Model.Description!=null)
{
@型号.说明
}
我的问题是,即使在执行过程中我可以在监视窗口中查看和导航模型对象,但如果测试表明'object'不包含“ShowApplied”的定义,我会在中得到RuntimeBinderException
。我可以通过调用(Model.GetType().GetProperty(“ShowApplied”).GetValue(Model)
)通过反射获得值,但更愿意使用代码示例中显示的格式。我一直无法找到一个干净的解决方案
如何将匿名类型的对象传递给局部视图并直接访问其属性?我觉得我缺少了一些简单的东西李>
为什么调试时我可以看到模型
属性,但不能从代码中访问它们?
编辑
- 我指定@model dynamic
- 使用接口需要创建非匿名类型,因为
匿名类型不能强制转换为除对象
之外的任何接口或类型
从评论中得出的见解(谢谢)意味着我有两个选择,因为(正如对相关问题的回答所指出的)
匿名类型是内部类型,因此无法在其定义程序集之外看到其属性
因此,剃须刀绑定引擎无法访问
使用@Html.DisplayFor(“amount”)
并处理没有IntelliSense、参考查找等问题
创建实现公共接口的类,并将我的局部视图绑定到该接口
从评论中得出的见解(谢谢)意味着我有两个选择,因为(正如对相关问题的回答所指出的)
匿名类型是内部类型,因此无法在其定义程序集之外看到其属性
因此,剃须刀绑定引擎无法访问
使用@Html.DisplayFor(“amount”)
并处理没有IntelliSense、参考查找等问题
创建实现公共接口的类,并将我的局部视图绑定到该接口
您是否在partialview中将您的模型指定为:@model dynamic
@DavidTansey我确实指定了dynamic
,但没有什么区别您可以将您的部分视图绑定到接口。然后让您的各种类实现您需要的适当接口。@Jasen这可能是一个很好的解决方案;恢复Intellisense将是一个额外的好处。您是否在partialview中将您的模型指定为:@model dynamic
@DavidTansey我确实指定了dynamic
,但这没有什么区别您可以将您的部分视图绑定到接口。然后让您的各种类实现您需要的适当接口。@Jasen这可能是一个很好的解决方案;恢复Intellisense将是一个额外的好处。您是否在partialview中将您的模型指定为:@model dynamic
@DavidTansey我确实指定了dynamic
,但这没有什么区别您可以将您的部分视图绑定到接口。然后让您的各种类实现您需要的适当接口。@Jasen这可能是一个很好的解决方案;返回Intellisense将是一个额外的好处。从已接受的答案链接到链接问题的可能的副本指出了第三个选项-ExpandoObject
。我自己还没有尝试过这个,但可能会继续创建类,而不是教我的团队ExpandoObject,这不适用于我们所有的项目。尝试ExpandoObject
只是为了好玩-本文概述了一个扩展,以反映动态对象。否则,View/Partial
调用会抛出兼容错误:System.Web.Mvc.HtmlHelper'没有名为“Partial”的适用方法,但似乎有一个同名的扩展方法。无法动态调度扩展方法。考虑动态参数或调用扩展方法,而不使用扩展方法语法。< /代码>,从链接问题的已接受答案链接起来,指出第三个选项-<代码> ExpObObjs< /Cord>。我自己还没有尝试过这个,但可能会继续创建类,而不是教我的团队ExpandoObject,这不适用于我们所有的项目。尝试ExpandoObject
只是为了好玩-本文概述了一个扩展,以反映动态对象。否则,View/Partial
调用会抛出兼容错误:System.Web.Mvc.HtmlHelper'没有名为“Partial”的适用方法,但似乎有一个同名的扩展方法。无法动态调度扩展方法。考虑动态参数或调用扩展方法,而不使用扩展方法语法。< /代码>,从链接问题的已接受答案链接起来,指出第三个选项-<代码> ExpObObjs< /Cord>。我自己还没有尝试过这个,但可能会继续创建类,而不是教我的团队ExpandoObject,这不适用于我们所有的项目。尝试ExpandoObject
只是为了好玩-本文概述了一个扩展,以反映动态对象。其他人