在MVC 3 Partial View中将匿名类型作为模型传递

时间:2015-06-01 21:33:28

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

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

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

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

@Html.Partial("_Partial", model1)

部分视图然后尝试基于特定属性的存在来呈现某些块,即

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

我的问题是,即使我在执行期间可以在观察窗口中看到并导航Model对象,我在RuntimeBinderException测试中得到if,表明'object' does not contain a definition for 'ShowApplied' }。我可以通过调用(Model.GetType().GetProperty("ShowApplied").GetValue(Model))通过反射获取值,但更倾向于使用我的代码示例中显示的格式。我一直无法找到一个干净的解决方案......

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

    • 我正在指定@model dynamic。
    • 使用界面需要创建非匿名类型,因为this answer explains
      

    object外,无法将匿名类型强制转换为任何界面或类型。

1 个答案:

答案 0 :(得分:0)

评论中的见解(谢谢)暗示我有2个选项,因为(作为链接问题的答案指出),

  

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

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

  1. 使用@Html.DisplayFor("amount")处理没有智能感知,参考查找等问题。

  2. 创建实现公共接口的类,并将部分视图绑定到该接口。