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)
查看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)
| 归档时间: |
|
| 查看次数: |
9757 次 |
| 最近记录: |