Мои идентификаторы одинаковы с использованием foreach и @ Html.DropDownListFor - PullRequest
0 голосов
/ 23 июня 2018

Я борюсь с моим приложением MVC 5.Я пытаюсь создать форму, основанную на моей модели.

Модель довольно проста, и для этого я полностью уменьшил ее до голой

Survey.cs имеет только 1 свойство

public Dictionary<Answer, AnswerTemplate> QuestionAndAnswerTemplates { get; set; }

У Answer.cs есть только 1 свойство

public string AnswerValue {get;set;}

У AnswerTemplate.cs есть 2 свойства

    public string ConstraintsCsv { get; set; }
    public IEnumerable<SelectListItem> ConstraintsFroDropDownList
    {
        get
        {
            var result = new List<SelectListItem>();
            var split = ConstraintsCsv?.Split(',');
            foreach (var s in split)
            {
                result.Add(new SelectListItem() { Text = s });
            }
            return result;
        }
    }

И, наконец, CSHTML (просмотр)

@model Survey

@using (Html.BeginForm())
{
    foreach (var item in Model.QuestionAndAnswerTemplates)
    {
        @Html.DisplayFor(a => item.Key.Question)<br />
        @Html.DropDownListFor(a => item.Key.AnswerValue, item.Value.ConstraintsFroDropDownList)
        <br /><br />
    }

    <input type="submit" value="Save" />
}

Dictionary заполнен 2 элементами, и поэтому я вижу 2 DropDownLists на отображаемом HTML в браузере.Отлично!

Проблема в том, что когда я проверяю исходный код отрендеренного HTML, я получаю следующее

<select id="item_Key_AnswerValue" name="item.Key.AnswerValue">
<option>1</option>
<option>2</option>
<option>3</option>
</select>        <br /><br />
<select id="item_Key_AnswerValue" name="item.Key.AnswerValue">
<option>Yes</option>
<option>No</option>
</select>        <br /><br />

Как видите, каждый ID такой же, какэто name Почему это?Я хотел бы иметь возможность нажать кнопку Сохранить и получить полностью заполненную модель.

Контроллер

 [HttpPost]
 public ActionResult Survey(Survey model)
 {
     return View();//need to do something here
 }

Но, model всегда не заполнен (пустые значения).

Что я делаю не так?

1 Ответ

0 голосов
/ 23 июня 2018

При редактировании коллекции предметов в бритвенном представлении не используйте foreach, а простой цикл for.

Таким образом, вместо:

foreach (var item in Model.QuestionAndAnswerTemplates)
{
    @Html.DisplayFor(a => item.Key.Question)<br />
    @Html.DropDownListFor(a => item.Key.AnswerValue, item.Value.ConstraintsFroDropDownList)
    <br /><br />
}

Используйте это:

for(var i = 0; i < Model.QuestionAndAnswerTemplates.Count(); i++)
{
    @Html.DisplayFor(a => Model.QuestionAndAnswerTemplates[i].Key.Question)<br />
    @Html.DropDownListFor(a => Model.QuestionAndAnswerTemplates[i].Key.AnswerValue, item.Value.ConstraintsFroDropDownList)
    <br /><br />
}

Если вы сделаете это, как указано выше, тогда атрибут name каждого вашего элемента select будетпривязать к позиции вашего шаблона в Model.QuestionAndAnswerTemplates.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...