2016-10-08 12 views
1

ControllerコンストラクトとフィルモデルのMy GETメソッド(Dictionary<int, MyClass>を含む)をViewに送信します。しかし、その後、POSTコントローラメソッドは空の辞書でnullモデルを取得しません。MVC:POSTコントローラメソッドが空になる

モデル:

public class CheckBoxItem 
    { 
    public string Name { get; set; } 
    public double Data { get; set; } 
    public bool Selected { get; set; } 
    } 
    public class CreateNewEventModel 
    { 
    [Required(ErrorMessage = "Error text")] 
    [Display(Name = "Header name")] 
    public string EventName { get; set; } 
    public Dictionary<int, CheckBoxItem> CheckBoxDataItems { get; set; } 
    public CreateNewEventModel() 
    { 
     CheckBoxDataItems = new Dictionary<int, CheckBoxItem>(); 
    } 
    } 

コントローラー:

public ActionResult CreateEvent() 
    { 
     CreateNewEventModel model = new CreateNewEventModel(); 
     // FILL MODEL 
     foreach (var user in db.UsersInfo.ToList()) 
     { 
     model.CheckBoxDataItems.Add(user.Id, new CheckBoxItem() 
     { 
      Name = user.Name, 
      Data = 0, 
      Selected = false 
     }); 
     } 
     // THERE IS FULL MODEL 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult CreateEvent(CreateNewEventModel model) 
    { 
     // THERE IS model.Event name include text 
     // BUT model.CheckBoxDataItems is empty 
     if (ModelState.IsValid) 
     { 
     ...  
     return View(model); 
     } 
     return View(model); 
    } 

ビュー:私はディ内部のデータを送信するにはどうすればよい

@model HLyaa.Models.CreateNewEventModel 

@{ 
    ViewBag.Title = "Create Event"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Создание события</h2> 

@if (Model.CheckBoxDataItems.Count() != 0) 
{ 
    using (Html.BeginForm("CreateEvent", "Events", FormMethod.Post)) 
    { 
    @Html.ValidationSummary() 
    <div> 
     @Html.LabelFor(model => model.EventName) 
     <div> 
     @Html.EditorFor(model => model.EventName) 
     </div> 
    </div> 
    <table> 
     @foreach (var kvpair in Model.CheckBoxDataItems) 
     { 
     <tr> 
      <td> 
      @Html.CheckBoxFor(model => model.CheckBoxDataItems[kvpair.Key].Selected) 
      </td> 
      <td> 
      @Html.DisplayFor(model => model.CheckBoxDataItems[kvpair.Key].Name) 
      @Html.HiddenFor(model => model.CheckBoxDataItems[kvpair.Key].Selected)    
      @Html.HiddenFor(model => model.CheckBoxDataItems[kvpair.Key].Name)   
      </td> 
      <td> 
      @Html.TextBoxFor(model => model.CheckBoxDataItems[kvpair.Key].Data, new { @type = "number" }) 
      </td> 
     </tr> 
     } 
    </table> 
    <br /> 
    <input type="submit" value="Next" /> 
    } 
} 

ViewからControllerへのctionary?

答えて

3

ディクショナリのno、List/Arrayはいですが、いくつか変更する必要があります。

修正モデル

public class CheckBoxItem { 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public double Data { get; set; } 
    public bool Selected { get; set; } 
} 

public class CreateNewEventModel { 
    [Required(ErrorMessage = "Error text")] 
    [Display(Name = "Header name")] 
    public string EventName { get; set; } 
    public List<CheckBoxItem> CheckBoxDataItems { get; set; } 
    public CreateNewEventModel() { 
     CheckBoxDataItems = new List<CheckBoxItem>(); 
    } 
} 

変更GETメソッドでCreateEvent

public ActionResult CreateEvent() { 
    var model = new CreateNewEventModel(); 
    //...FILL MODEL 
    foreach (var user in db.UsersInfo.ToList()) { 
     model.CheckBoxDataItems.Add(new CheckBoxItem() { 
      UserId = user.Id, 
      Name = user.Name, 
      Data = 0, 
      Selected = false 
     }); 
    } 
    // THERE IS FULL MODEL 
    return View(model); 
} 

更新ビュー

<table> 
    @for (var i = 0; i < Model.CheckBoxDataItems.Count; i++) { 
    <tr> 
     <td> 
     @Html.CheckBoxFor(model => model.CheckBoxDataItems[i].Selected) 
     </td> 
     <td> 
     @Html.DisplayFor(model => model.CheckBoxDataItems[i].Name) 
     @Html.HiddenFor(model => model.CheckBoxDataItems[i].UserId) 
     @Html.HiddenFor(model => model.CheckBoxDataItems[i].Selected) 
     @Html.HiddenFor(model => model.CheckBoxDataItems[i].Name) 
     </td> 
     <td> 
     @Html.TextBoxFor(model => model.CheckBoxDataItems[i].Data, new { @type = "number" }) 
     </td> 
    </tr> 
    } 
</table> 

CheckBoxDataItemsあなたは

+0

Yをコントローラに投稿するとき、今移入する必要がありますes。あなたが正しいです!その本当に働いています。しかし、私は辞書がなぜ空であるのか理解できませんが、リストは理解できません。モデルで使用できるタイプを説明してください。 –

+0

これは、ビュー内のモデルプロパティの参照方法と関係があります。 'foreach'を使うと、ビューは、投稿されたときにリストに戻るリストのためのHTMLを生成しません。 'model.CheckBoxDataItems [i] .Name'のようなインデックスを参照すると、ビューは' name = "CheckBoxDataItems [0] .Name"のような名前を生成し、投稿時にリストに正しく変換されます。 – Nkosi

+0

フレームワークは送信されたフォームデータを解釈し、強く型付けされたオブジェクトに変換しようとします。 – Nkosi

関連する問題