渲染部分与空模型获取通过错误的types

我有一个页面:

<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %> 

并在其上,如下:

 <% Html.RenderPartial("TaskList", Model.Tasks); %> 

这是DTO对象:

 public class DTOSearchResults { public string SearchTerm { get; set; } public IEnumerable<Task> Tasks { get; set; } 

这里是部分:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %> 

当Model.Tasks不为null时,一切工作正常。 然而,当它为空时,我得到:

传入字典的模型项目types为“DTOSearchResults”,但是此字典需要types为“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的,因为ViewDataDictionary是持有模型的东西,它可以接受模型作为构造函数参数。 这基本上传递了一个“整个”视图数据字典,当然这只包含可能null模型。

看来,当你传入的模型属性为null时,MVC有意地返回到“父”模型。 显然,MVC引擎将空模型值解释为意图使用前一个模型值。

稍微更多的细节在这里: ASP.NET MVC,强types的意见,局部视图参数故障

如果您不想在部分视图中放弃先前的ViewData,则可以尝试:

 <% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%> 

解决办法是创build一个像这样的HtmlHelper:

 public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, string partialViewName, T model) { ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData) { Model = model }; return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData); } 

Partial<T>(...)之前匹配Partial<T>(...) Partial(...)非常方便,并且在编译时没有模糊性错误。

我个人觉得难以理解这种行为 – 似乎很难将其想象为deviseselect?

虽然这个问题已经得到解答,但是我碰到了这个问题,并且决定我想为我的项目解决这个问题,而不是用new ViewDataDictionary()来解决这个问题。

我创build了一组扩展方法: https : //github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
我还添加了一些方法,如果模型为null,则不会调用partial,这将节省大量的if语句。

我为Razor创build了它们,但其中的一些应该也可以使用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<object>模型的方法,抛弃者也可以使用Razor lambda来调用,它允许用一些html来包装部分结果。

随意使用他们,如果你喜欢。

我的解决方法是:

<% Html.RenderPartial("TaskList", Model.Tasks ?? new List()); %>
<% Html.RenderPartial("TaskList", Model.Tasks ?? new List()); %>