2012-03-19 5 views
2

私は、フォームと部分フォームの2つのバリエーションについて疑問に思っています。サブミットは親ページにあり、私は部分ビューに渡すものを変更しました。メインビューには、次のMVC 3パーシャルビューとそれに送信する必要があるもの

@model MasterDetailSample.Models.HomeViewModel 

@using (Html.BeginForm()) { 
    <div> 
     @{Html.RenderPartial("_PersonView", @Model);} 
    </div> 
    <input type="submit" value="Save" />   
} 

ようなものを有する:シナリオ1(

1. {;セットを取得}パブリックプロパティ名と公開人の従業員を有する)I関連HomeViewModelと親ビューを持っていますこのシナリオでは、私はHomeViewModel全体を部分ビュー_PersonViewに渡しています。 _PersonView部分ビュー内で、@ model.Employee.Nameを介してHomeViewModelすなわちPersonオブジェクトのプロパティを参照する必要があります(このシナリオでは、サブフォームは部分ビュー内ではなく親フォームにあります)

コントローラのフォーム(POST)に次のモデルを介してEmployee "Name"のプロパティにアクセスする必要があります。Employee.Name

これは動作するようですが、部分的にEmployeeオブジェクト)

2.)シナリオ2 このシナリオでは、Employeeオブジェクトを部分ビューに送信するだけです。再び開始フォームと送信は親フォームにあります。

私はコントローラEmployeeオブジェクト内のフォームを提出するときに、親フォームから私は今@ Employee.Nameを経由してPersonオブジェクトのNameプロパティを参照する部分ビュー内

@{Html.RenderPartial("_MasterView", @Model.Employee);} 

などを持っています自動車モデルのバインダーからは入手できません。私は、モデルパラメータ

すなわち

[HttpPost] 
    public ActionResult Index(ModelViewModel model) { 
     **//model.Employee is null!** 
     return View(); 
    } 

なぜからformcollectionを経由してプロパティにアクセスすることはできませんが? (model.Employee nullです)私はパーツビューのPersonオブジェクトを受け入れるだけですが、親ページから送信した後、Employeeプロパティはnullです。部分ビューでは、私はそれだけに送信されるPersonオブジェクトが必要に部分をしたいと思い@modelライン上

@model MasterDetailSample.Models.Person 

を以下のように使用していますが、私は、メインフォームに提出したいと思います。私はこのようにすれば、いくつかの状況で部分ビューを再利用することができますが、HomeViewModelを送信する必要がある場合、この部分ビューをどのように使用できるかが大幅に制限されています。だから、私は部分ビューのモデルとしてPersonを使いたいだけですが、親ビューからサブミットしたときにプロパティにアクセスできる必要があります。

これはできますか?はいの場合はどうですか?

答えて

1

THXあなたはオプションのカップルを持っている:

1)一つ、私はお勧めします - >いけない代わりにEditorForを使用して、個人用のエディタのテンプレートを作成して、部分的なビューを使用します。部分的なビューでは、コンテキストはビューに渡すモデルに関係なく、これがあなたの例(1)が機能し、(2)そうでない理由です。しかしエディタテンプレートでは、親コンテキストはhtmlヘルパーと一緒に考慮され、正しい入力名を生成します。 Have a look at Darin Dimitrov's answerも同様の質問です。

2)であるとして、あなたの第二の例を使用しますが、このような何か見てポストアクションを変更:

[HttpPost] 
public ActionResult Index(ModelViewModel model) { 
    TryUpdateModel(model.Employee); 
    **//model.Employee should now be filled!** 
    return View(); 
} 

3)カスタムHTMLヘルパーを使用した入力の接頭辞を受け入れ、私はしばらく前に掲示this answerを参照してください例えばコード。あなたは部分ビューの中でこれを使うことができます。

関連する問題