在嵌套在子文件夹中的Partial中使用@model dynamic会抛出RuntimeBinderException

时间:2014-07-28 17:38:16

标签: c# asp.net-mvc razor dynamic model

我在寻找解决方案方面遇到了一些问题,虽然看起来很简单,但我想其他人之前必须遇到这个问题。

使用MVC / Razor 4,我试图使用动态模型渲染部分。 为了组织事物,我将我的部分放在同一个视图文件夹中的子文件夹中。

当有问题的部分被移动到子文件夹时,它会抛出一个RuntimeBinderException,并带有一条异常消息,说明' object'不包含' Id'的定义(我试图访问的参数)。

当partial位于同一文件夹中时,此功能完全正常。

此结构正常

  • 查看/订单/ Details.cshtml
  • 查看/订单/ _PartialWithDynamicModel.cshtml

此结构导致异常

  • 查看/订单/ Details.cshtml
  • 查看/订单/ MyPartials / _PartialWithDynamicModel.cshtml

CODE

Details.cshtml

    @Html.Partial("MyPartials/_PartialWithDynamicModel", new { Id = 54 } )

_PartialWithDynamicModel.cshtml

    @model dynamic

    @ { //The following line throws the RuntimeBinderException
        int id = Model.Id; }

有什么想法?如果我将部分移动到与视图相同的文件夹中,一切正常。

1 个答案:

答案 0 :(得分:0)

您的问题是您无法将匿名类型传递给单独程序集中的对象。它们被创建为"内部"类型,因此不能从外部传递。视图在运行时动态生成到它们自己的程序集中。

相反,请使用ExpandoObject,如下所示:

@{ var myExpando = new ExpandoObject();
   myExpando.Id = 54; }
@Html.Partial("MyPartials/_PutOnHoldForm",  myExpando)

然而,更好的选择是传递一个ViewDataDictionary,或者使用元组。

MVC期货项目中还有一个DynamicViewPage扩展,允许您在没有扩展对象的情况下执行此操作。

http://weblogs.asp.net/imranbaloch/using-the-features-of-asp-net-mvc-3-futures

(注意,它说MVC3,但在Nuget有一个MVC5版本的期货)