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

时间:2011-05-03 12:50:15

标签: asp.net-mvc asp.net-mvc-2 model-binding

我有一个名为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中重新打开这个复选框列表在回发后

2 个答案:

答案 0 :(得分:2)

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

查看由this questionHaacked'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“默认绑定器为其自身使用而查看”,并且需要为每个复选框重复使用不同的值。