Asp.net mvc [HttpPost]编辑操作方法中的数据绑定(?)问题
我有一个名为ArticleAdmin的viewmodel,其中包含一个复选框列表:Asp.net mvc [HttpPost]编辑操作方法中的数据绑定(?)问题,asp.net-mvc,asp.net-mvc-2,model-binding,Asp.net Mvc,Asp.net Mvc 2,Model Binding,我有一个名为ArticleAdmin的viewmodel,其中包含一个复选框列表: public class ArticleAdmin { public ArticleAdmin() { TopicCheckboxes = new List<TopicCheckbox>(); } ... public IList<TopicCheckbox> TopicCheckboxes { get; set; }
public class ArticleAdmin
{
public ArticleAdmin()
{
TopicCheckboxes = new List<TopicCheckbox>();
}
...
public IList<TopicCheckbox> TopicCheckboxes { get; set; }
...
}
这对于将模型传递到视图非常有效:(更新:为了清晰起见,新加入了此操作方法) 。。。articleData.TopicCheckBox的计数为0
那么,如何使模型绑定正常工作,以便ActionMethod中的复选框列表在回发时正确填充?您已经初始化了
主题复选框,但没有向其添加元素
查看由和回答的问题,它有一个自定义的ModelBinder来附加列表。好的,我主要是根据这个问题来解决的:
由于我现在觉得这可能是一个重复的问题,我将删除它,除非有人在第二天左右进来评论它在其他方面是有用的
关键在于在复选框的输入名称属性中设置数组结构。在我的例子中,这意味着每个复选框都需要一系列隐藏值:
<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。索引“默认活页夹为自己使用而查看的”,并且需要为每个复选框重复不同的值。谢谢。我正在深入研究这个示例,看看是否能理解它——看起来我需要深入研究ModelBindingContext和ControllerContext。目前,我只想澄清一下(我更新了我的问题以反映这一点):填充要发送到视图的模型没有问题,问题是HttpPost操作方法上的模型绑定。
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]
public ActionResult Edit(ArticleAdmin articleData)
<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>