我有一个页面:
<%@ Page Inherits="System.Web.Mvc.View" %>
在其上,以下内容:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
这是DTO对象:
public class DTOSearchResults { public string SearchTerm { get; set; } public IEnumerableTasks { get; set; }
这是部分:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %>
当Model.Tasks不为null时,一切正常.但是当它为null时,我得到:
传递到字典中的模型项的类型为'DTOSearchResults',但此字典需要类型为'System.Collections.Generic.IEnumerable`1 [Task]'的模型项.
我认为它一定不知道使用哪个重载,所以我这样做(见下文)是明确的,但我仍然得到同样的问题!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
我知道我可以通过检查null,或者甚至不传递null来解决这个问题,但这不是重点.为什么会这样?
安德鲁我认为你得到的问题是RenderPartial方法的结果,当你传递的模型为null时,使用调用(视图)的模型到局部视图.你可以通过这样做来解决这个奇怪的行为:
<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary()); %>
这有帮助吗?
@ myandmycode的答案很好,但稍微短一些
<% Html.RenderPartial("TaskList", new ViewDataDictionary(Model.Tasks)); %>
这是有效的,因为它ViewDataDictionary
是持有模型的东西,它可以接受模型作为构造函数参数.这基本上传递了一个"整个"视图数据字典,当然它只包含可能为空的模型.
看来,当您传入的Model的属性为null时,MVC会故意恢复为"父"模型.显然,MVC引擎将空模型值解释为使用前一个模型值的意图.
这里稍微详细一点:ASP.NET MVC,强类型视图,局部视图参数故障
如果您不想在局部视图中丢失以前的ViewData,可以尝试:
<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%>
一个解决方案是创建一个像这样的HtmlHelper:
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, T model) { ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData) { Model = model }; return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData); }
在Partial
之前的匹配Partial(...)
,从而方便编译时没有歧义错误.
我个人觉得很难理解这种行为 - 似乎很难想象这是设计选择吗?
虽然这已经得到了解答,但我遇到了这个并决定我想为我的项目解决这个问题,而不是解决它new ViewDataDictionary()
.
我创建了一组扩展方法:https:
//github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
我还添加了一些方法,如果模型为null,则不调用partial ,这将节省很多if语句.
我为Razor创建了它们,但其中一些也应该使用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
模型的方法,丢弃的方法也可以用Razor lambda调用,允许你用一些html包装部分结果.
如果你愿意,可以随意使用它们.