为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2019-12-12 14:39:07
我有一个页面:<%@ 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来解决此问题,但这不是重点。为什么会这样呢?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

Andrew,我认为您遇到的问题是RenderPartial方法的结果,该方法使用的是在您传递的模型为null时对部分视图进行调用(视图)的模型。通过执行以下操作,可以解决这种奇怪的行为:


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

有帮助吗?


查看完整回答
反对 回复 2019-12-12
?
PIPIONE

TA贡献1829条经验 获得超9个赞

稍微短一点的答案是


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

之所以可行,ViewDataDictionary是因为它拥有模型,并且可以接受模型作为构造函数参数。这基本上通过了“整个”视图数据字典,该字典当然仅包含可能为空的模型


查看完整回答
反对 回复 2019-12-12
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

一个解决方案是创建一个像这样的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(...),从而方便编译时没有歧义错误。


我个人觉得很难理解行为-很难想象这是设计选择吗?


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 355 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信