Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在MVC 3部分视图中将匿名类型作为模型传递_Asp.net Mvc_Asp.net Mvc 3_Parameter Passing_Partial Views_Anonymous Types - Fatal编程技术网

Asp.net mvc 在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

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

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
    只是为了好玩-本文概述了一个扩展,以反映动态对象。其他人