2011-05-03 30 views
0

我有一個視圖模型稱爲ArticleAdmin包括複選框列表(?):問題的數據綁定在[HttpPost]編輯ActionMethod

public class ArticleAdmin 
{ 
    public ArticleAdmin() 
    { 
     TopicCheckboxes = new List<TopicCheckbox>(); 
    } 

    ... 

    public IList<TopicCheckbox> TopicCheckboxes { get; set; } 

    ... 
} 

ToopicCheckbox有它自己的視圖模型類,在一個單獨的文件中定義:

public class TopicCheckbox 
{ 
    public bool IsAssociated { get; set; } 

    public string TopicName { get; set; } 

    public int TopicId { get; set; } 
} 

這非常適用於通過模型到視圖:
UPDATE:此操作方法是新包括了一些清晰度)

public ActionResult Edit(int id) 
    { 
     //Get the Article entity by id: 
     var articleEntity = Repository.Articles.Get<Article>(id); 

     //Map the entity to the viewmodel: 
     Mapper.CreateMap<Article, ArticleAdmin>(); 

     // 2nd mapping to populate the article's relations to topics: 
     Mapper.CreateMap<TopicArticle, TopicArticleAdmin>(); 

     var articleData = Mapper.Map<Article, ArticleAdmin>(articleEntity); 

     //Generate checkboxes (models) to manage associations with topics: 
     foreach (var topic in Repository.Topics.List()) 
     { 
      var topicCheckbox = new TopicCheckbox { TopicId = topic.Id, TopicName = topic.Title }; 

      if (Repository.TopicArticles.FindList(x => x.TopicId == topic.Id && x.ArticleId == id).Count() > 0) 
       topicCheckbox.IsAssociated = true; 

      //and add them to the viewmodel: 
      articleData.TopicCheckboxes.Add(topicCheckbox); 
     } 

     return View(articleData); 

    } 

...所有我預計出現在表單中的複選框:

但顯然這份名單並不是模型綁定回[HttpPost]「編輯」 ActionMethod。

即使在表單中填充了TopicCheckboxes列表,ActionMethod中的列表也是空的。

[HttpPost] 
public ActionResult Edit(ArticleAdmin articleData) 

... articleData.TopicCheckboxes的計數爲0。

所以,我怎麼模型綁定正常工作,使複選框回到ActionMethod的這個名單是正確填充後上-back

回答

2

您已初始化TopicCheckBoxes,但未添加元素。

結帳this question這是由Haacked's articlethis answer回答,它有一個自定義ModelBinder附加列表。

+0

感謝LordCover。我深入這個例子,看看我能否理解它 - 看起來像我需要挖掘ModelBindingContext和ControllerContext。目前,我只是想澄清(我已經更新了我的問題以反映這一點):填充模型發送到視圖沒有問題,問題是模型綁定HttpPost操作方法。 – Faust 2011-05-04 07:18:15

0

好了,我理解了它很大程度上基於這樣一個問題:Custom Model Binder for Complex composite objects HELP

正如我現在覺得這可能是一個重複的問題,我會刪除它,除非有人來在未來一天左右並評論說它是有用的。

關鍵是在複選框的輸入名稱屬性中設置數組結構。在我而言,這意味着每個複選框需要一系列隱藏的價值:

<div> 

    <input type = "checkbox" name="TopicCheckboxes[1].IsAssociated" value = "true"id="topic_1" checked /> 

    <input type = "hidden" name = "TopicCheckboxes.Index" value = "1" /> 
    <input type = "hidden" name="TopicCheckboxes[1].IsAssociated" value = "false" /> 
    <input type = "hidden" name = "TopicCheckboxes[1].TopicName" value = "test" /> 
    <input type = "hidden" name = "TopicCheckboxes[1].TopicId" value = "1" /> 
    <label for='topic_1'> test </label> 
</div> 

的真的,真的很重要字段是第一個隱藏字段:TopicCheckboxes.Index「它的默認粘結劑看它自己使用」,並且需要爲每個複選框重複使用不同的值。