202

我有一个页面:

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

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

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

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

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

4

7 回答 7

351

安德鲁,我认为您遇到的问题是当您传递的模型为空时,RenderPartial 方法使用调用(视图)的模型到局部视图的结果。您可以通过执行以下操作来解决这种奇怪的行为:

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

这有帮助吗?

于 2009-04-03T13:32:52.337 回答
48

@myandmycode 的答案很好,但会稍短一些

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

这是有效的,因为它ViewDataDictionary是保存模型的东西,它可以接受模型作为构造函数参数。这基本上传递了一个“整个”视图数据字典,当然它只包含可能为空的模型。

于 2011-03-15T15:14:17.523 回答
28

看来,当您传入的模型的属性为空时,MVC 会故意恢复为“父”模型。显然,MVC 引擎将 null 模型值解释为使用前一个模型值的意图。

这里稍微详细一点:ASP.NET MVC,强类型视图,部分视图参数故障

于 2010-07-30T16:35:11.687 回答
20

如果您不想在局部视图中丢失以前的 ViewData,您可以尝试:

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%>
于 2012-08-20T12:23:52.077 回答
12

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

我个人觉得很难理解这种行为 - 似乎很难将其想象为设计选择?

于 2011-11-29T17:21:01.580 回答
11

尽管已经回答了这个问题,但我遇到了这个问题,并决定为我的项目解决这个问题,而不是使用new ViewDataDictionary().

我创建了一组扩展方法: https
://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs 我还添加了一些在模型为空时不调用部分的方法,这将节省大量的 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<object>模型方法,丢弃方法也可以使用 Razor lambda 调用,它允许您使用一些 html 包装部分结果。

如果您愿意,请随意使用它们。

于 2012-04-21T11:41:10.517 回答
1

我的解决方法是:


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

于 2015-01-21T07:57:20.047 回答