我在寻找解决方案方面遇到了一些问题,虽然看起来很简单,但我想其他人之前必须遇到这个问题。
使用MVC / Razor 4,我试图使用动态模型渲染部分。 为了组织事物,我将我的部分放在同一个视图文件夹中的子文件夹中。
当有问题的部分被移动到子文件夹时,它会抛出一个RuntimeBinderException,并带有一条异常消息,说明' object'不包含' Id'的定义(我试图访问的参数)。
当partial位于同一文件夹中时,此功能完全正常。
此结构正常
此结构导致异常
CODE
Details.cshtml
@Html.Partial("MyPartials/_PartialWithDynamicModel", new { Id = 54 } )
_PartialWithDynamicModel.cshtml
@model dynamic
@ { //The following line throws the RuntimeBinderException
int id = Model.Id; }
有什么想法?如果我将部分移动到与视图相同的文件夹中,一切正常。
答案 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版本的期货)