MVC3: части модели не восстанавливаются при обратной передаче - PullRequest
1 голос
/ 22 сентября 2011

Части моих моделей неправильно восстанавливаются при обратной передаче.

Модели

public class DemographicsModel
{
    public List<QuestionModel> Questions { get; set; }
}

public abstract class QuestionModel
{
    [HiddenInput(DisplayValue = false)]
    public int ID { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string Title { get; set; }
}

public abstract class ChooseQuestionModel : QuestionModel
{
    public abstract List<SelectListItem> Items { get; set; }
}

public class ChooseManyQuestionModel : ChooseQuestionModel
{
    [Required]
    [DataType("CheckBoxList")]
    public override List<SelectListItem> Items { get; set; }
}

Просмотры

ChooseManyQuestionModel.cshtml

@model X.Y.Z.ChooseManyQuestionModel

<div class="Form Wide NoLabel">
    <div class="Title">@this.Model.Title</div>
    @Html.TypeStamp()
    @Html.EditorFor(m => m.ID)
    @Html.EditorFor(m => m.Title)
    @Html.EditorFor(m => m.Items)
</div>

CheckBoxList.cshtml

@model IEnumerable<SelectListItem>

@if (!this.Model.IsNullOrEmpty())
{
    foreach (var item in this.Model)
    {
        <div>
            @Html.HiddenFor(m => item.Value)
            @Html.HiddenFor(m => item.Text)
            @Html.CheckBoxFor(m => item.Selected)
            @Html.LabelFor(m => item.Selected, item.Text)
        </div>
    }
}

Я полагаю, что проблема заключается в CheckBoxList.cshtml, так как эти элементы не восстанавливаются при обратной передаче.Контроллер

public class AccountController : BaseController
{
    public ActionResult Demographics()
    {
        return this.View(new DemographicsModel());
    }

    [HttpPost]
    public ActionResult Demographics(DemographicsModel model)
    {
        return this.View(model);
    }
}

При обратной передаче DemographicsModel заполняется правильными типами (я использую MvcContrib для обработки привязки абстрактного типа).List<Question> заполняется всеми правильными данными, включая идентификатор и заголовок каждого вопроса из скрытых полей.Тем не менее, List<SelectListItem> в каждом вопросе имеет значение null.

Обновление 1

Проблема определенно возникает из-за неправильного имени полей.Например, имена полей «item» генерируются следующим образом:

Questions_1__Items_item_Value

Когда они действительно должны выглядеть следующим образом (добавление индекса элемента и удаление ошибочного «item»):

Questions_1__Items_1__Value

Аналогично, идентификаторы полей создаются следующим образом (добавление индекса элемента и удаление ошибочного «элемента»):

Questions[1].Items.item.Value

Вместо:

Questions[1].Items[0].Value

ИспользованиеFiddler с правильными идентификаторами, отправляемыми обратно, модель построена правильно со всеми установленными переключателями и флажками.

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Попробуйте следующее.

В ChooseManyQuestionModel.cshtml измените @Html.EditorFor(m => m.Items) на:

@Html.EditorForModel(m => m.Items)

Затем в CheckBoxList.cshtml измените @model IEnumerable<SelectListItem> на:

@model SelectListItem

Наконец, в каждом элементе измените каждое лямбда-выражение и измените item на m, затем удалите цикл foreeach.Это позволит редактору выполнять итерацию по коллекции и дать вам правильную генерацию идентификатора для каждого элемента.

0 голосов
/ 18 марта 2013

Когда используется цикл foreach, идентификаторы, сгенерированные в HTML, одинаковы.
Когда используется поиск, идентификаторы генерируются с индексом циклов for, поэтому привязка происходит правильно и все данные доступны после обратной отправки.

0 голосов
/ 22 сентября 2011

В этом случае кажется, что класс Helper делает не то, что вы хотите.Я бы предложил написать свой собственный вспомогательный класс, чтобы назвать ваши входные данные в точности так, как вам требуется.

...