C# 在子文件夹的部分嵌套中使用@model dynamic会引发RuntimeBinderException

C# 在子文件夹的部分嵌套中使用@model dynamic会引发RuntimeBinderException,c#,asp.net-mvc,razor,dynamic,model,C#,Asp.net Mvc,Razor,Dynamic,Model,我在为这个问题寻找解决方案时遇到了一些问题,尽管这似乎已经够直截了当了,我想肯定有其他人以前遇到过这个问题 使用MVC/Razor4,我尝试使用动态模型渲染局部。 为了组织事情,我将我的部分放在同一视图文件夹的子文件夹中 当有问题的部分被移动到子文件夹时,它抛出一个RuntimeBinderException,并显示一条异常消息,表示“object”不包含我试图访问的参数“Id”的定义 当分部文件位于同一文件夹中时,此操作非常有效 这个结构很好用 Views/Orders/Details.csh

我在为这个问题寻找解决方案时遇到了一些问题,尽管这似乎已经够直截了当了,我想肯定有其他人以前遇到过这个问题

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

当有问题的部分被移动到子文件夹时,它抛出一个RuntimeBinderException,并显示一条异常消息,表示“object”不包含我试图访问的参数“Id”的定义

当分部文件位于同一文件夹中时,此操作非常有效

这个结构很好用

Views/Orders/Details.cshtml 视图/订单/_PartialWithDynamicModel.cshtml 此结构导致异常

Views/Orders/Details.cshtml Views/Orders/MyPartials/\u PartialWithDynamicModel.cshtml 代码

Details.cshtml

_PartialWithDynamicModel.cshtml


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

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

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

@{ var myExpando = new ExpandoObject();
   myExpando.Id = 54; }
@Html.Partial("MyPartials/_PutOnHoldForm",  myExpando)
然而,更好的选择是只传递ViewDataDictionary,或者使用元组

MVC futures项目中还有DynamicViewPage扩展,它允许您在不使用expand对象的情况下也执行此操作


注意,上面说的是MVC3,但是Nuget中有一个MVC5版本的futures

为什么不@model intI我尝试传递的不仅仅是id,我更希望不必为这个部分创建一个类。您在Details.cshtml中指定的名称与您正在调试的部分不同。我猜你犯了个错误?你真的需要发布准确的代码,否则我们会走错路。好的。。。但是,我必须假设嵌套的分部也被放置在单独的程序集中,因为当分部被放置在与视图相同的文件夹中时,传递匿名对象是有效的。你真的需要给出准确的答案,否则我们就错了path@Nicholas-如果它按照你的建议工作,那么它可能是一个意外。你不能相信这种情况会一直持续下去,将来可能会破裂。无法保证任何动态编译的对象都会保留在同一个程序集中。我遇到了相同的问题,即使使用ExpandoObject和@model dynamic,我也会遇到运行时异常:“System.dynamic.ExpandoObject”不包含“id”的定义。
    @model dynamic

    @ { //The following line throws the RuntimeBinderException
        int id = Model.Id; }
@{ var myExpando = new ExpandoObject();
   myExpando.Id = 54; }
@Html.Partial("MyPartials/_PutOnHoldForm",  myExpando)