如果我有看法,从继承:
System.Web.Mvc.ViewPage<Foo>
其中,foo有一个字符串类型的属性栏
并查看要呈现从继承强类型的局部视图:
System.Web.Mvc.ViewUserControl<string>
像这样:
Html.RenderPartial("_Bar", Model.Bar);%>
那么,为什么它会抛出这样的:
传递到字典的模型产品类型的“富”
但本词典需要类型的模型项目“System.String”。
当未初始化吧?
更具体的:为什么它传递美孚,它应该通过空?
作为@Dennis指出,如果模型值为null,它将使用现有的模型与视图。 这样做的原因是为了支持使用只包含部分视图名称,并将它重新使用现有模型的签名调用的局部视图的能力。 在内部,所有的RenderPartial佣工推迟到一个RenderPartialInternal方法。 你说的方法来重用现有模型的方式是在模型(这是只需要一个视图名称的签名一样)一个空值传递。 当你传递一个空值同时含有视图名称和模型对象的签名,你基本上是复制,它只接受视图名称的方法的行为。
这应该可以解决您的问题:
<% Html.RenderPartial( "_Bar", Model.Bar ?? string.Empty ) %>
看ASP.NET MVC源(HtmlHelper.cs - > RenderPartialInternal方法 - >线258):
...
if (model == null) {
if (viewData == null) {
newViewData = new ViewDataDictionary(ViewData);
}
...
这正是你的情况。 ASP.NET MVC使用的ViewData从ViewContext
更新:
试试这个:
<% Html.RenderPartial("_Bar", Model.Bar ?? "Default" ); %>
如果你传递null作为模型的RenderPartial,那么它就会查看原始模型,这就是为什么说错误FOO。
你需要确保杆被初始化为空字符串,而不是空。
编辑:@Arnis,看看源代码。 它不会说谎。 您传递null到的RenderPartial的过载。 您还没有经过美孚 。 在内部,系统将使用您的网页ViewContext模型(这是美孚 )当您传递一个空栏来的RenderPartial。
虽然这已经回答了,我跑过这个决定,我想解决这个问题,我的项目,而不是围绕它正与“新的ViewDataDictionary()”。
我创建了一组扩展方法: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
我还添加了一些方法没有调用部分如果模型为null,这将节省大量的if语句。
我创建了他们剃须刀,但他们夫妇还应该ASPX风格的视图(使用HelperResult可能不兼容的)工作。
扩展方法是这样的:
@* calls the partial with Model = null *@
@Html.PartialOrNull("PartialName", null)
@* does not call the partial if the model is null *@
@Html.PartialOrDiscard("PartialName", null)
也有对IEnumerable的模型的方法和丢包的人也可以用剃刀拉姆达,让您有一些HTML包裹部分结果调用。
随意如果你喜欢使用它们。