使用foreach和@ Html.DropDownListFor,我的ID都一样

时间:2018-06-23 14:45:34

标签: c# razor asp.net-mvc-5

我正在努力使用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个项目,因此,我在浏览器中呈现的HTML上看到2个DropDownLists。太好了!

问题是,当我检查呈现的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 />

如您所见,每个IDname是相同的 为什么是这样?我希望能够单击“保存”按钮,并具有一个完全填充的模型。

控制器是

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

但是,model始终未填充(空值)。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

在剃刀视图中编辑项目集合时,不使用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中的位置。