2

私はMVCに次のモデルを持っています:

public class IndexViewModel
{
    public SubViewModel SubViewModel { get; set; }
}

私のインデックスビューでは、次のエディタを表示するために次のことを行っていますSubViewModel

Index.cshtml

@model IndexViewModel

@Html.EditorFor(m => m.SubViewModel)

私のSubViewModel.cshtmlファイルでは、次のことを試みました。

EditorTemplates / SubViewModel.cshtml

@model SubViewModel

@Html.EditorForModel("SubViewModelForm")

基本的に、エディターを2つに分割したいと思います。最初のエディターテンプレートがフォームを作成し、内側のテンプレートが実際のフォームフィールドをすべて作成します。問題は、内部ビューがレンダリングされないことです。

これは、MVCが、そのモデルで既にEditorForを呼び出していることを認識し、それを再度実行できないようにしているようなものです。これを機能させる方法はありますか?

編集

何が起こっているのかをはっきりとタイプしたと思いましたが、そうではないと思います。

2つのテンプレートを使用して1つのモデルを表示したいと思います。最初のテンプレートでは、フォームと送信ボタン、およびいくつかのコンテナdivをレンダリングします。

2番目のテンプレートでは、すべてのフォームフィールドをレンダリングします。

Index.cshtml @ Html.EditorFor(m => m.SubViewModel)->フォームとコンテナをレンダリングします

SubViewModel.cshtml @ Html.EditorForModel( "SubViewModelForm")->フォームフィールドをレンダリングします

問題は、2番目の呼び出し(@ Html.EditorForModel( "SubViewModelForm"))が何もしないように見えることです。タグをまったくレンダリングしません。MVCによって無視されています。

この方法でやりたいのは、このフォームをajax呼び出しで投稿するためです。すべてが正常である(モデルの状態が有効である)場合は、JSONデータをビューに返します。モデルが無効な場合は、フォームフィールドのみを含む部分ビューを返します。このようにして、すべてのイベントハンドラーを再度接続する必要はありません。ビュー全体ではなく、フォームフィールドを置き換えることができます。

4

2 に答える 2

5

これはTemplateInfo.Visitedメソッドと関係があると思います。EditorFor簡単に言うと、同じオブジェクトに対して2回使用することはできません。これが、SubViewModelのエディターが(Index.cshtmlから)既にレンダリングされているため、mvcが2番目のEditorForModelを無視する理由です。

これが最善の回避策であるかどうかはわかりませんが、最初に頭に浮かぶのは、Html.Partialを呼び出して、2番目のテンプレートを部分ビューとしてレンダリングすることです。

@model SubViewModel

@Html.Partial("SubViewModelForm", Model)
于 2011-12-06T15:57:09.677 に答える
1

追加の詳細を読んだ後、コンテナテンプレートテンプレートを使用するのが最善だと思います。

/* Container.cshtml (container markup and call to editor template) */
<fieldset>                    
    @Html.EditorForModel()
</fieldset>

/* SubViewModel.cshtml editor template */
@model SubViewModel

@Html.DisplayFor(x => x.Property1)
@Html.EditorFor(x => x.Property1)
...

/* Index.cshtml */
@Html.RenderPartial("Container.cshtml", Model.SubViewModel)
于 2011-12-06T15:28:35.097 に答える