猿问

具有null模型的renderpartial传递了错误的类型

我有一个页面:


<%@ 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,则一切正常。但是,当它为null时,我得到:


传递到字典中的模型项的类型为'DTOSearchResults',但此字典需要模型类型为'System.Collections.Generic.IEnumerable'1 [Task]'的模型项。


我认为它一定不知道要使用哪个重载,因此我明确地做到了这一点(见下文),但是仍然遇到相同的问题!


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

我知道我可以通过检查null甚至不传递null来解决此问题,但这不是重点。为什么会这样呢?


慕田峪7331174
浏览 356回答 3
3回答

慕田峪9158850

Andrew,我认为您遇到的问题是RenderPartial方法的结果,该方法使用的是在您传递的模型为null时对部分视图进行调用(视图)的模型。通过执行以下操作,可以解决这种奇怪的行为:<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary()); %>有帮助吗?

PIPIONE

稍微短一点的答案是<% Html.RenderPartial("TaskList", new ViewDataDictionary(Model.Tasks)); %>之所以可行,ViewDataDictionary是因为它拥有模型,并且可以接受模型作为构造函数参数。这基本上通过了“整个”视图数据字典,该字典当然仅包含可能为空的模型

吃鸡游戏

一个解决方案是创建一个像这样的HtmlHelper:public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, string partialViewName, T model){&nbsp; &nbsp; ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Model = model&nbsp; &nbsp; };&nbsp; &nbsp; return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData);}在Partial<T>(...)之前的匹配Partial(...),从而方便编译时没有歧义错误。我个人觉得很难理解行为-很难想象这是设计选择吗?
随时随地看视频慕课网APP
我要回答