我有一个名为ArticleAdmin的视图模型,其中包含一个复选框列表:
public class ArticleAdmin
{
public ArticleAdmin()
{
TopicCheckboxes = new List<TopicCheckbox>();
}
...
public IList<TopicCheckbox> TopicCheckboxes { get; set; }
...
}
ToopicCheckbox有自己的viewmodel类,在单独的文件中定义:
public class TopicCheckbox
{
public bool IsAssociated { get; set; }
public string TopicName { get; set; }
public int TopicId { get; set; }
}
这适用于将模型传递到视图中:
( UPDATE :为了清晰起见,新添加了此Action方法)
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]“Edit”ActionMethod。
即使在表单中填充了TopicCheckboxes列表,ActionMethod中的列表也是空的。
[HttpPost]
public ActionResult Edit(ArticleAdmin articleData)
... articleData.TopicCheckboxes的计数为0。
那么如何使模型绑定正常工作以便在ActionMethod中重新打开这个复选框列表在回发后?
答案 0 :(得分:2)
您已初始化TopicCheckBoxes
,但未添加元素。
查看由this question和Haacked's article回答的this answer,其中包含自定义ModelBinder以附加列表。
答案 1 :(得分: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“默认绑定器为其自身使用而查看”,并且需要为每个复选框重复使用不同的值。