ASP.NET MVC,强类型视图,局部视图参数故障

Arn*_*psa 22 asp.net-mvc null strongly-typed-view

如果我得到了继承自的视图:

System.Web.Mvc.ViewPage<Foo>
Run Code Online (Sandbox Code Playgroud)

其中Foo有一个带有类型字符串的属性栏
和视图想要呈现强类型的局部视图,它继承自:

System.Web.Mvc.ViewUserControl<string>  
Run Code Online (Sandbox Code Playgroud)

像这样:

Html.RenderPartial("_Bar", Model.Bar);%>
Run Code Online (Sandbox Code Playgroud)

那为什么会抛出这个:

传递到字典中的模型项是'Foo'类型,
但是这个字典需要一个'System.String'类型的模型项.

当bar未初始化时?

更具体:为什么它传递Foo,它应该传递null?

tva*_*son 35

正如@Dennis所指出的,如果模型值为null,它将使用视图中的现有模型.这样做的原因是支持使用仅包含部分视图名称的签名调用部分视图并使其重用现有模型的能力.在内部,所有RenderPartial助手都遵循单个RenderPartialInternal方法.您获得该方法以重用现有模型的方法是为模型传递空值(仅采用视图名称的签名).将空值传递给包含视图名称和模型对象的签名时,实质上是复制仅采用视图名称的方法的行为.

这应该可以解决您的问题:

<% Html.RenderPartial( "_Bar", Model.Bar ?? string.Empty ) %>
Run Code Online (Sandbox Code Playgroud)

  • @kdawg - 或者只使用带有第二个操作数的null coalesing运算符作为模型类型的合适默认值,例如`new Foo()` (2认同)

eu-*_*-ne 9

查看ASP.NET MVC源代码(HtmlHelper.cs - > RenderPartialInternal方法 - >第258行):

...

if (model == null) {
    if (viewData == null) {
        newViewData = new ViewDataDictionary(ViewData);
    }

...
Run Code Online (Sandbox Code Playgroud)

这正是你的情况.ASP.NET MVC使用ViewContext中的ViewData

更新:

试试这个:

<% Html.RenderPartial("_Bar", Model.Bar ?? "Default" ); %>
Run Code Online (Sandbox Code Playgroud)

  • +1"查看ASP.NET MVC源"http://aspnet.codeplex.com/sourcecontrol/changeset/view/23011?projectName=aspnet#266468查看RenderPartialExtensions.cs也会有所帮助.http://aspnet.codeplex.com/sourcecontrol/changeset/view/23011?projectName=aspnet#288013 (3认同)