Проблема с привязкой данных (?) В [HttpPost] Редактировать ActionMethod - PullRequest
0 голосов
/ 03 мая 2011

У меня есть viewmodel под названием 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; }
}

Это хорошо работает для передачи модели в вид:
( ОБНОВЛЕНИЕ : этот метод действия недавно включен для большей ясности)

    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 ]

2 голосов
/ 03 мая 2011

Вы инициализировали TopicCheckBoxes, но не добавили к нему элементы.

Проверьте этот вопрос , на который ответили Статья Хаакеда и этот ответ , который имеет собственный ModelBinder для прикрепления списков.

0 голосов
/ 04 мая 2011

ОК, я понял это, основываясь в основном на этом вопросе: Пользовательская модель Binder для сложных составных объектов 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, "которое связыватель по умолчанию рассматривает для своего собственного использования", и его нужно повторять с разными значениями для каждого флажка.

...