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

本文关键字:dynamic @model RuntimeBinderException 文件夹 嵌套 Partial | 更新日期: 2023-09-27 18:15:10

我在寻找解决这个问题的方法时遇到了一些问题,尽管它看起来足够直接,我想其他人以前一定遇到过这个问题。

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

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

当部分位于同一文件夹中时,此操作完全正常。

这个结构很好

  • 视图/订单/Details.cshtml
  • 视图/订单/_PartialWithDynamicModel.cshtml

这个结构导致异常

  • 视图/订单/Details.cshtml
  • 视图/订单/MyPartials/_PartialWithDynamicModel.cshtml

Details.cshtml

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

_PartialWithDynamicModel.cshtml

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

任何想法吗?如果我将部分移动到与视图相同的文件夹中,一切都可以正常工作。

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

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

相反,使用ExpandoObject,如下所示:
@{ var myExpando = new ExpandoObject();
   myExpando.Id = 54; }
@Html.Partial("MyPartials/_PutOnHoldForm",  myExpando)
然而,一个更好的选择是只传递一个ViewDataDictionary,或者使用Tuples。

在MVC未来项目中也有DynamicViewPage扩展,它允许您在没有扩展对象的情况下也这样做。

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

(注意,它是MVC3,但Nuget中有MVC5版本的期货)