首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将NULL子对象从父对象传递到部分视图

将NULL子对象从父对象传递到部分视图
EN

Stack Overflow用户
提问于 2010-03-18 02:06:40
回答 3查看 3.3K关注 0票数 8

我有一个对象,其中包含我的ASP.NET MVC web应用程序的模型。传递到视图中的模型具有该特定视图上的“小工具”的子模型。这些子模型中的每一个都被传递到一个局部视图(gadget)。

问题是当我在视图模型中有一个空模型时。请参见下面的示例。

查看模型:

代码语言:javascript
复制
public class FooBarHolder()
{
     public FooBar1 FooBar1 { get; set; }
     public FooBar2 FooBar2 { get; set; }
}

我们将FooBarHolder传递到视图中,并在视图中进行如下调用

代码语言:javascript
复制
<% Html.RenderPartial("Foo", Model.FooBar1); %>
<% Html.RenderPartial("Foo2", Model.FooBar2); %>

现在假设Model.FooBar2为空。我在强类型分部视图中遇到的错误是“该视图需要一个FooBar2类型的模型,但却得到了一个FooBarHolder类型的模型”。

为什么会发生这种情况,而不是只传递一个null?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-18 02:33:03

这就是RenderPartial方法是如何工作的(我知道应该被记录下来,写博客,等等……我也觉得这有点奇怪)。如果不指定模型或传递null,它将使用父页面的模型。要避免这种情况,可以使用null合并运算符:

代码语言:javascript
复制
<% Html.RenderPartial("Foo", Model.FooBar1 ?? new Foo()); %>

如果你真的很好奇这是如何实现的,这里有一个摘录自ASP.NET MVC2源代码的相关部分:

代码语言:javascript
复制
// Renders the partial view with an empty view data and the given model
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model) {
    htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, model, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
}

internal virtual void RenderPartialInternal(string partialViewName, ViewDataDictionary viewData, object model, TextWriter writer, ViewEngineCollection viewEngineCollection) {
    if (String.IsNullOrEmpty(partialViewName)) {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");
    }

    ViewDataDictionary newViewData = null;

    if (model == null) {
        if (viewData == null) {
            newViewData = new ViewDataDictionary(ViewData);
        }
        else {
            newViewData = new ViewDataDictionary(viewData);
        }
    }
    else {
        if (viewData == null) {
            newViewData = new ViewDataDictionary(model);
        }
        else {
            newViewData = new ViewDataDictionary(viewData) { Model = model };
        }
    }

    ViewContext newViewContext = new ViewContext(ViewContext, ViewContext.View, newViewData, ViewContext.TempData, writer);
    IView view = FindPartialView(newViewContext, partialViewName, viewEngineCollection);
    view.Render(newViewContext, writer);
}

请注意null模型的情况是如何处理的。

票数 8
EN

Stack Overflow用户

发布于 2015-09-30 09:34:14

为了避免在子模型为空时传递父模型,请使用以下技巧:

代码语言:javascript
复制
@Html.Partial("Child", null, new ViewDataDictionary<ChildType>(childInstance/*this can be null*/))

Credit where due...

票数 2
EN

Stack Overflow用户

发布于 2010-12-20 06:36:57

我对这个奇怪的“特性”的解决方法(或者可能是bug?)是:

代码语言:javascript
复制
<% Html.RenderPartial(
    "Foo2", 
    new ViewDataDictionary(ViewData) { Model = Model.FooBar2 }
); %>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2464690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档