2016-05-18 15 views
0

ビルドしようとしているものに関する情報を含む過去2日間の私の頭を傷つけています。フォームを介してIList <model>の値を取得し、MVCのコントローラに渡す方法

私が構築しようとしています機能: シンプルトリップマネージャアプリケーション

別のフォーム(ビュー)につながる、出張名とインデックス・ページ上の人の数の値を取得し、それを提出する人の数に応じてどこテキストボックスが生成され、そのフォームデータを別のコントローラに渡します。ここで、私はそれをデータベースに保存します。

モデル: トリップ

public class Trip 
    { 
     public Trip() 
     { 
      //people = new List<People>(); 
     } 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public decimal Income { get; set; } 
     public decimal Expense { get; set; } 
     public int NumberOfPeople { get; set; } 
     public virtual IList<People> people{ get; set; } 
    } 

人々

public class People 
    { 
     public int Id { get; set; } 
     public int TripId { get; set; } 
     [DisplayName("Name:")] 
     public string Name { get; set; } 
     [DisplayName("Initial Deposite:")] 
     public decimal InitialDeposite { get; set; } 


    } 

これは、ここで私は、人々の2つの入力名と番号取っています、のようにIndex.cshtmlビューがどのように見えるかです:

@model TripManager.Models.Trip 
@{ 
    ViewBag.Title = "Welcome to Trip Manager"; 
} 

<div class="jumbotron"> 
    <h1>Trip Manager</h1> 
    <p class="lead">Trip Manager helps you calculate your group trip expenses in ease.</p> 
</div> 

<div class="row"> 
    <div class="col-md-12 text-center"> 
      @using (Html.BeginForm("Index","Trip")) 
      { 

       @Html.AntiForgeryToken(); 
       @*@Html.HiddenFor(m=>m.Id)*@ 
       <p class="text-info">@Html.LabelFor(m => m.Name)</p> 
       <p class="glyphicon-search">@Html.EditorFor(m => m.Name) @Html.ValidationMessageFor(m => m.Name)</p> 


       <p class="text-info">@Html.LabelFor(m => m.NumberOfPeople)</p> 
       <p class="glyphicon-search">@Html.EditorFor(m => m.NumberOfPeople) @Html.ValidationMessageFor(m => m.NumberOfPeople)</p> 
       <p><input type = "submit" class="btn-success" name="btnTripInit" value="Go Trip" /></p> 
      } 
    </div> 
</div> 

以下の通りであるコントローラポスト動作指数(トリップトリップ)を介してビューをmember.cshtmlするためにこれらの入力を渡す、

public ActionResult Index(Trip trip) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(trip); 
    } 

    var mytrip = new Trip(); 
    mytrip.Name = trip.Name; 
    mytrip.NumberOfPeople = trip.NumberOfPeople; 
    mytrip.people = new List<People>(trip.NumberOfPeople); 

    return View("Members", trip); 
} 

とmembers.cshtmlビューは以下の通りです...ここで私はIListのためのテキストボックスを作成していますトリップモデルで....のdeposite

@model TripManager.Models.Trip 
{ 
    @ViewBag.Title = "Please Enter Members Details"; 
} 
<div class="row"> 
    <div class="col-md-12 text-center"> 
     @{ 
      using (Html.BeginForm("FeedMemberData", "Trip",FormMethod.Post)) 
      { 
      <hr /> 
      @Html.HiddenFor(m=>m.Id) 
       for(int i=0;i<Model.NumberOfPeople;i++) 
       { 
       <p>Member @i Details</p> 
       @Html.HiddenFor(m => m.people[i].Id) 
       <p class="text-info">@Html.LabelFor(m=>m.people[i].Name) @Html.EditorFor(m => m.people[i].Name , new {@class="glyphicon-search"}) 
       | @Html.LabelFor(m => m.people[i].InitialDeposite) @Html.EditorFor(m => m.people[i].InitialDeposite , new { @class = "glyphicon-search" }) 
       </p> 
       } 
      <hr /> 
      <p><input type="submit" class="btn-success" name="btnMemberInit" value="Save Details" /></p> 
      } 
    } 
    </div> 
</div> 

初期の名前と他の一つのテキストボックスは、今私はEntityFrameworkを経由してDBにそれをコントローラおよび保存するには、このフォームデータを送信する必要がありますか?ここ

public ActionResult FeedMemberData(Trip trip) 
{ 
    //TODO 
} 

旅行のために私はあなたが、コントローラメソッドに掲載されることを期待トリップオブジェクトがnullの場合はnull ....

答えて

0

が、私はそれは通常、問題とによって引き起こされることがわかり取得していますhtmlページが正しくデータをポストしていないか、フォームデータをモデルに正しく解決できないMVCモデルのバインダー(この場合はTripオブジェクト)がサーバーにポストされると予想されます。

私が推測するならば、あなたのメソッド "FeedMemberData"にあなたがあなたのモデルとして使っているトリップオブジェクトではなく、実際には人物の配列です。以下を試して、モデルのバインダーが投稿データをリストにバインドするかどうかを確認してください。

[HttpPost] 
public ActionResult FeedMemberData(List<People> people) 
{ 
    //TODO 
} 
+0

はありません@ジョナサンにデータを供給しながら、0からインデックス作成を開始していることを確認します実際に私は、トリップを掲示しています私のTripクラスはIList を持っています。 – BakerStreet221

+0

@Pratham、申し訳ありません、私はもっと助けになることができませんでした。あなたは[フィドラー](http://www.telerik.com/fiddler)のようなツールを使ってみましたか?私に間違ったデータや期待していないデータを与えるコントローラアクションがあると、このフリーツールを使ってサーバーに送信されているものを正確に診断できます。また、私は[HttpPost]属性を含むように私の答えを編集しました。私はフォームからデータを受け取っているときに明示的に好きです。 –

+0

フィドラー@jonathanに関する提案があります。私は右のデータをコントローラに送り返すことができました – BakerStreet221

0

問題が後で特定され、いくつかの変更が加えられて機能しました。

一般注:

あなたはIEnumerableをコントローラにnullを返すような問題に直面している場合のIList

@model TripManager.Models.Trip 
{ 
    @ViewBag.Title = "Please Enter Members Details"; 
} 
<div class="row"> 
    <div class="col-md-12 text-center"> 
     @{ 
      using (Html.BeginForm("FeedMemberData", "Trip",FormMethod.Post)) 
      { 
      <hr /> 
      @Html.HiddenFor(m=>m.Id) 
      //this must start from 0 
       for(int i=0;i<Model.NumberOfPeople;i++) 
       { 
       <p>Member @i Details</p> 
       @Html.HiddenFor(m => m.people[i].Id) 
       <p class="text-info">@Html.LabelFor(m=>m.people[i].Name) @Html.EditorFor(m => m.people[i].Name , new {@class="glyphicon-search"}) 
       | @Html.LabelFor(m => m.people[i].InitialDeposite) @Html.EditorFor(m => m.people[i].InitialDeposite , new { @class = "glyphicon-search" }) 
       </p> 
       } 
      <hr /> 
      <p><input type="submit" class="btn-success" name="btnMemberInit" value="Save Details" /></p> 
      } 
    } 
    </div> 
</div> 
関連する問題