2013-03-26 10 views
6

私のビューモデルでは、オブジェクトのリストがあります。私はこれらのオブジェクトを反復し、それぞれのコントロールを作成します。以下の状況では、各オブジェクトにテキストボックスとボタンを表示する必要があります。ユーザーがボタンをクリックすると、投稿が作成され、コントローラーにデータを保存できます。 UIでMVC 4でコントロールとフォーム(Html.BeginForm)を送信する各ループについて

、ユーザーは、彼らが望むフォームを変更し、[保存]をクリックすることができます。

私の問題は、それがコントローラに掲載されますときに、モデルがnullの..です

マイカミソリコード

 using (Html.BeginForm()) 
     { 
      foreach (var contributor in Model.Contributor) 
      { 

     @Html.HiddenFor(model => contributor.Id) 

     <div class="formrow"> 
      @Html.ValidationSummary(true) 
     </div> 

     <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
     <div class="formrow"> 

      @Html.EditorFor(model => contributor.FirstName) 
      <div class="formvalidation"> 
       @Html.ValidationMessageFor(model => contributor.FirstName) 
      </div> 
     </div> 


     <div class="formrow right"> 
      <input type="hidden" name="formsubmitted" value="true" /> 
      <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
     </div> 
      } 
     } 

マイビューモデルコード

public class ProfileModel 
{ 
    public string Message { get; set; } 
    public List<PublisherModel> Publisher { get; set; } 
    public List<ContributorModel> Contributor { get; set; } 

    public ContributorModel NewContributor { get; set; } 
} 

私のコントローラコード

[HttpPost] 
public ActionResult Mine(ProfileModel model, string newuser) 
{ 
    // 
} 

これを修正するにはどうすればよいですか?

は、私はいくつかの方法で変更を保存するための方法で私の見解モデルを展開する必要が推測します。しかし、私は本当にどのように見ることができません。それがコントローラに到達したときに

は今ProfileModel内のすべてのプロパティはnullです。

アイデア?

+0

が、それはまだヌルですか? ' –

+0

あなたは' @ Html.EditorForためにレンダリングしてHTMLを投稿することができます(モデルは=> contributor.FirstName)は、VIEWでのモデルは、(HttpPost)ContributorModelの一覧で、まだモデルが掲載されていますProfileModel?あなたの編集/表示と同じモデルタイプではありません! –

+0

代がすぐそこに見えない – Zeddy

答えて

14

基本的に問題は、デフォルトのモデルバインダーがforeachループでコレクション項目を正しくバインドできないことです。つまり、要素の名前が正しくないため、コレクションにパラメータとしてnullが表示されるのです。

私は別の回避策、ヘルパーやもののすべての種類があります確信しているが、私はそれらに精通していないので、私はちょうど、ループの代わりに、foreachのための要素が正しく命名されているこの方法を使用します。

はこれを試してみてください:

@for (int i = 0; i < Model.Contributor.Count(); i++) 
    { 

     @Html.HiddenFor(model => Model.Contributor[i].Id) 

     <div class="formrow"> 
      @Html.ValidationSummary(true) 
     </div> 

     <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
     <div class="formrow"> 

      @Html.EditorFor(model => Model.Contributor[i].FirstName) 
      <div class="formvalidation"> 
       @Html.ValidationMessageFor(model => Model.Contributor[i].FirstName) 
      </div> 
     </div> 


     <div class="formrow right"> 
      <input type="hidden" name="formsubmitted" value="true" /> 
      <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
     </div> 
    } 

私は[0] [0] .ID、コントリビュータあなたのケースで、彼らが貢献者のようになります、あなたは要素が正しいname属性を持っているかどうかを確認するために、デバッグツールを使用することをお勧めします。姓など

+1

私は最近このようなことをしました。モデルバインダーは各オブジェクトのインデックスを見ることができない場合リストにバインドできません。したがって、 'Contributor [i]'が必要です。 forループが気に入らなければ、 'foreach(var、someCollection.Select((x、i)=> new {Value = x、Index = i}))')も 'thing.Index 'をループのインデックス(forループの' i'の代わりに)として、 'thing.Value'をオブジェクトとして使用します。 – anaximander

+0

私はその解決策を考えていないでしょう。ありがとう!本当に役に立ちます:-) –

+0

面白いのは、視覚スタジオがforループをforeachループに変換するよう提案していて、データが投稿されたら正しくバインドされていないため、コードが機能しなくなります – Dario

5

あなたはContributorオブジェクトに対してPartialViewを使用することができます。 PartialView:

@model Contributor 
using (Html.BeginForm("ContributorUpdate", "YourController")) 
{ 
    @Html.HiddenFor(model => Model.Id) 
    <div class="formrow"> 
    @Html.ValidationSummary(true) 
    </div> 

    <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
    <div class="formrow"> 

    @Html.EditorFor(model => Model.FirstName) 
    <div class="formvalidation"> 
     @Html.ValidationMessageFor(model => Model.FirstName) 
    </div> 
</div> 
<div class="formrow right"> 
    <input type="hidden" name="formsubmitted" value="true" /> 
    <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
</div> 
} 

ビューは次のようになります。

@foreach (var contributor in Model.Contributor) 
{ 
    @{Html.RenderPartial("Conributor", contributor);} 
} 

そして、コントローラコード:あなたがaswell文字列メッセージを投稿する場合

[HttpPost] 
public ActionResult Mine(Conributor conributor, string newuser) 
{ 
    // 
} 
関連する問題