1

我有一个这样的模型:

public class ParentViewModel
{
   public class ChildViewModel { get; set; }
   // other properties
}

然后在视图中ParentViewModel,我这样做:

@Html.EditorFor(model => model.ChildViewModel)

它执行我的自定义编辑器模板,即使Model.ChildViewModelnull. 为什么?我认为 MVC 足够聪明,只在视图/模板有值时才渲染它。(例如,默认模板null是不渲染任何东西)。

因为目前,我必须将 HTML 包装在我的自定义编辑器模板中:

@if (Model != null)

这似乎很愚蠢。

这是一个已知问题吗?

我在 ASP.NET MVC 3,Razor 上。

4

2 回答 2

2

您可以使用新的扩展方法,而不是在您的部分之前或内部测试 null。这也为您提供了更多关于如何处理空模型的选项。这是我使用的扩展,它将测试 null 并返回空字符串或 null 结果的不同部分。这对于页面超出范围的寻呼机等特别有用,因为您可以使用“无结果”信息获得单独的部分。

namespace System.Web.Mvc.Html
{
    public static class nullpartials
    {
        public static MvcHtmlString NullPartial(this HtmlHelper helper, string Partial, object Model)
        {
            if (Model == null)
                return MvcHtmlString.Empty;
            else
                return helper.Partial(Partial, Model);
        }

        public static MvcHtmlString NullPartial(this HtmlHelper helper, string Partial, string NullPartial, object Model)
        {
            if (Model == null)
                return helper.Partial(NullPartial);
            else
                return helper.Partial(Partial, Model);
        }

        public static MvcHtmlString NullPartial(this HtmlHelper helper, string Partial, object Model, ViewDataDictionary viewdata)
        {
            if (Model == null)
                return MvcHtmlString.Empty;
            else
                return helper.Partial(Partial, Model, viewdata);
        }

        public static MvcHtmlString NullPartial(this HtmlHelper helper, string Partial, string NullPartial, object Model, ViewDataDictionary viewdata)
        {
            if (Model == null)
                return helper.Partial(NullPartial, viewdata);
            else
                return helper.Partial(Partial, Model, viewdata);
        }

        public static void RenderNullPartial(this HtmlHelper helper, string Partial, object Model)
        {
            if (Model == null)
            {
                return;
            }
            else
            {
                helper.RenderPartial(Partial, Model);
                return;
            }
        }

        public static void RenderNullPartial(this HtmlHelper helper, string Partial, string NullPartial, object Model)
        {
            if (Model == null)
            {
                helper.RenderPartial(NullPartial);
                return;
            }
            else
            {
                helper.RenderPartial(Partial, Model);
                return;
            }
        }

        public static void RenderNullPartial(this HtmlHelper helper, string Partial, object Model, ViewDataDictionary viewdata)
        {
            if (Model == null)
            {
                return;
            }
            else
            {
                helper.RenderPartial(Partial, Model, viewdata);
                return;
            }
        }

        public static void RenderNullPartial(this HtmlHelper helper, string Partial, string NullPartial, object Model, ViewDataDictionary viewdata)
        {
            if (Model == null)
            {
                helper.RenderPartial(NullPartial, viewdata);
                return;
            }
            else
            {
                helper.RenderPartial(Partial, Model, viewdata);
                return;
            }
        }
    }
}

编辑

抱歉,我误读了关于 EditorTemplates 的问题。但是,我认为相同的方法没有理由不适用于 EditorFor,您只需复制更多的方法签名即可。

于 2011-11-07T11:37:57.040 回答
1

我不认为 MVC 有那么聪明。它期望如果您调用渲染方法(displayFor、EditFor、Partial)并向其发送模型,则该模型将具有值(否则为 NullReferenceException)。据我所知,您的选择是:

  1. 要么有 2 个不同的视图(也许 2 个不同的视图模型?)
  2. 你建模!=空检查
  3. 使用从主模型传递参数的 renderAction 方法,让该操作知道您是否应该返回视图/部分视图或不返回任何内容。
于 2011-11-07T07:12:47.470 回答