【发布时间】: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)) 通过反射获取值,但更愿意使用我的代码示例中显示的格式。我一直找不到干净的解决方案...
- 如何将匿名类型的对象传递给局部视图并直接访问其属性?我觉得我缺少一些简单的东西......
- 为什么我在调试时可以看到
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