2013-02-10 83 views
0

本人有效以下視圖模型:ICollection的顯示爲空,ModelState中不MVC4

public class CreateCardViewModel 
    { 
     [HiddenInput(DisplayValue = false)] 
     public int SetId { get; set; } 

     [Required] 
     public ICollection<Side> Sides { get; set; } 

     [Required] 
     [DataType(DataType.Date)] 
     public DateTime DateCreated { get; set; } 

     [Required] 
     public bool IsReady { get; set; } 

    } 

而對於定義以下操作創建:

[HttpGet] 
     public ActionResult Create(int setId) 
     { 
      var model = new CreateCardViewModel(); 

      // attach card to current set 
      model.SetId = setId; 

      // create a new Side 
      var side = new Side() {Content = "Blank Side"}; 

      // Add this to the model's Collection 
      model.Sides = new Collection<Side> { side }; 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Create(CreateCardViewModel viewModel) 
     { 
      if (ModelState.IsValid) 
      { 
       var set = _db.Sets.Single(s => s.SetId == viewModel.SetId); 
       var card = new Card {Sides = viewModel.Sides}; 

       set.Cards.Add(card); 

       _db.Save(); 
      } 
      return View(viewModel); 


     } 

當我嘗試創建一張新卡片,viewModel的Sides屬性爲null,所以ModelState爲空。我無法弄清楚爲什麼最初的Side沒有通過模型傳遞。

我的視圖看起來是這樣的:

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>CreateCardViewModel</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.SetId) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.SetId) 
      @Html.ValidationMessageFor(model => model.SetId) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.DateCreated) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.DateCreated) 
      @Html.ValidationMessageFor(model => model.DateCreated) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.IsReady) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.IsReady) 
      @Html.ValidationMessageFor(model => model.IsReady) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 
+0

您的觀點是什麼樣子? – 2013-02-10 19:08:47

+0

我會在這裏添加它 – RobVious 2013-02-10 19:09:31

回答

1

您的視圖中沒有與您的ViewModel的Sides屬性綁定的內容。如果表單中沒有任何內容來保存該屬性的值,則在模型綁定發生時它將爲空。您需要以某種方式捕獲表單中的Side - 您如何添加/刪除此屬性?通過應該發生在表單上的用戶交互?

+0

謝謝你 - 我不知道viewmodel的每個屬性都需要從視圖中綁定。這就是爲什麼SetId需要在那裏,但沒有顯示?沒有這個,卡不會被關聯到Set? – RobVious 2013-02-10 19:29:03

+0

看起來像在視圖中有點混亂。有沒有更好的方法來照顧外鍵? – RobVious 2013-02-10 19:29:45

+0

您的ViewModel不需要遵循與您的基礎模型對象相同的域關聯。您可以並且傾向於將對象弄平,並且只需保留ViewModel需要顯示和操作的所有屬性,然後在實際將其映射回域時,可以重新填充域對象圖。如果您映射的屬性是外鍵,則可以將其存儲在「Html.Hidden」中,以確保在模型綁定期間將其傳回控制器。 – levelnis 2013-02-10 19:37:15

0

嘗試增加上創建)ICollection<Side>類型的第二個參數(,看看是否能得到任何東西傳遞給它。

+0

剛剛嘗試過 - 它沒有得到任何東西。看起來這個視圖接受了視圖模型,但它並沒有將這個視圖模型的兩端傳回控制器。 – RobVious 2013-02-10 19:20:28

+0

您可以發佈客戶端在發佈之前看到的HTML版本嗎? – Moo 2013-02-10 19:34:54