渲染部分与空模型获取通过错误的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()); %>