2012-02-21 3 views
1

私はこのような2つのビューモデルがあります:今MVC3のネスト部分ページ(およびビューモデル):フォームフィールドはどのようにバインドされますか?

public class ViewModel1 // maps to Model1 
{ 
    public string ViewModel1Desc { get; set; } 
    public ViewModel2 ViewModel2 { get; set; } 
    public ScheduleMasterEditViewModel() 
    { 
     ViewModel2= new ViewModel2(); 
    } 
} 

public class ViewModel2 // maps to Model2 
{ 
    public string ViewModel2Desc { get; set; } 
} 

を、私はViewModel2のための部分的なページを持っていると思ったとしてViewModel1ためのページを作成することを含める:

Create.cshtmlこの

ようになります
@model ViewModels.ViewModel1 
@using (Html.BeginForm()) { 
    @Html.EditorFor(model => model.ViewModel1Desc) 
    @Html.Partial("~/Views/ViewModel2/_ViewModel2Create.cshtml", Model.ViewModel2) 
} 

_ViewModel2Create.cshtmlが

@model ViewModels.ViewModel2 
@Html.EditorFor(model => model.ViewModel2Desc) 
のように見えます

問題がMODEL1について作成し、コントローラに、何もViewModel1.ViewModel2

にバインドされていない取得し、である私は、この正しい方法をやっている、または私はちょうどこのようなすべてのフィールドを書き出す必要があります。

+0

ビューをどのようにレンダリングしていますか? Html.RenderPartialまたはHtml.RenderAction?彼らは別の目的を果たします – CrazyCoderz

答えて

5

理由を正しいであるのに対し

<input type="text" name="ViewModel2Desc" /> 

ごViewModel2は、生成されたHTMLを見たときに、このサブモデル用に作成された入力フィールドが不正な名前を持っていることがわかりますされているため、バインドされていません10

これは、_ViewModel2Create.cshtml部分が、親のナビゲーションプロパティコンテキストを保持していないためです。 ~/Views/Shared/EditorTemplates/ViewModel2.cshtmlの内側にあなたの部分的なコードを移動

@model ViewModels.ViewModel1 
@using (Html.BeginForm()) { 
    @Html.EditorFor(model => model.ViewModel1Desc) 
    @Html.EditorFor(model => model.ViewModel2) 
} 

、その後:

​​

お知らせエディタの場所私はあなたが部分的にコールするのではなく、エディタのテンプレートを使用することをお勧めします。このため

テンプレート:~/Views/Shared/EditorTemplates。これは重要。 ASP.NET MVCがそれを探す場所です。実際には~/Views/XXX/EditorTemplatesが表示されます。XXXは、より具体的なテンプレートの現在のコントローラー名であり、Sharedフォルダー内に1つのルックアップが見つからない場合に表示されます。また、ファイルの名前に気づく:ViewModel2.cshtml。これはまた重要であり、それは慣例によって機能します。テンプレートの名前は、実際にはプロパティのタイプです。

あなたはこのオーバーライドすることができます:

@Html.EditorFor(model => model.ViewModel2, "_ViewModel2Create") 

またはビューモデルにUIHint属性を使用して:

public class ViewModel1 
{ 
    public string ViewModel1Desc { get; set; } 
    [UIHint("_ViewModel2Create")] 
    public ViewModel2 ViewModel2 { get; set; } 
    public ScheduleMasterEditViewModel() 
    { 
     ViewModel2 = new ViewModel2(); 
    } 
} 

をしてから~/Views/Shared/EditorTemplates/_ViewModel2Create.cshtmlを持っています。

+0

私にそれを打つ男性 – CrazyCoderz

+0

ありがとう、それはこれまで私のために働いているようです。好奇心のために、これがパーシャルを使って動作する方法はありますか?または、編集用ではなく表示専用の部分文字列ですか? – getit

関連する問題