在子文件夹中嵌套的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; }
任何想法吗?如果我将部分移动到与视图相同的文件夹中,一切都可以正常工作。
您的问题是无法将匿名类型传递给单独程序集中的对象。它们被创建为"内部"类型,因此不能向外部传递。视图在运行时动态地生成到它们自己的程序集中。
相反,使用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版本的期货)