Asp.net mvc [HttpPost]编辑操作方法中的数据绑定(?)问题

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; }

我有一个名为ArticleAdmin的viewmodel,其中包含一个复选框列表:

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>