1

私はこのようなモデルを持っています:

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

次に、のビューでParentViewModel、私はこれを行います:

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

そして、がである場合でも、カスタムエディタテンプレートを実行しModel.ChildViewModelますnull。なんで?MVCは、値がある場合にのみビュー/テンプレートをレンダリングするのに十分スマートだと思いました。(たとえば、のデフォルトのテンプレートnullは何もレンダリングしないことです)。

現時点では、カスタムエディタテンプレートのHTMLを次のようにラップする必要があるためです。

@if (Model != null)

これは非常にばかげているようです。

これは既知の問題ですか?

私はASP.NETMVC3、Razorを使用しています。

4

2 に答える 2

2

部分的な前またはその内部で null をテストするのではなく、新しい拡張メソッドを使用できます。これにより、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はそれほど賢いとは思いません。render メソッド (displayFor、EditFor、Partial) を呼び出してモデルを送信すると、そのモデルに値が含まれることが期待されます (そうでなければ NullReferenceException)。私が知る限り、あなたの選択肢は次のとおりです。

  1. 2つの異なるビューがあります(おそらく2つの異なるビューモデル?)
  2. モデル化しますか != null チェック
  3. ビュー/部分ビューを返すか、何も返さないかをアクションに知らせるプライマリ モデルからパラメーターを渡す renderAction メソッドを使用します。
于 2011-11-07T07:12:47.470 に答える