凭借我的ASP.NET WebForms经验,这是我的第一个MVC项目
这是一个我认为机制不允许的问题,但我可能是错的
在DropDownListFor
中@foreach
并不是那么简单
首先,下拉列表不会选择我传递给它的值(m => question.Answer
) - 请注意下图中的所有值都显示No Answer
,因为它没有选择我加载的正确值它与。
其次,由于它们都以相同的表单字段名称结束,控制器怎么能将它们分成相应的列表<>?
我一直在看这个一个小时,并寻找一个类似的例子,但我找不到任何
什么是一个好的解决方案,不是硬编码的黑客或解决方法?
型号:
public List<SelectListItem> PossibleAnswers
{
get
{
return new List<SelectListItem>()
{
new SelectListItem() { Text = "No Answer", Value = "0" },
new SelectListItem() { Text = "Very Bad", Value = "1" },
new SelectListItem() { Text = "Bad", Value = "2" },
new SelectListItem() { Text = "Average", Value = "3" },
new SelectListItem() { Text = "Good", Value = "4" },
new SelectListItem() { Text = "Very Good", Value = "5" }
};
}
}
public enum SurveyAnswer
{
NoAnswer,
VeryBad,
Bad,
Average,
Good,
VeryGood
}
public class SurveyQuestionClass
{
public int ID { get; set; }
public string Question { get; set; }
public SurveyAnswer Answer { get; set; }
}
public List<SurveyQuestionClass> QuestionsAnswers { get; set; }
查看:
@foreach (var question in Model.QuestionsAnswers)
{
<tr>
<td>
@Html.DropDownListFor(m => question.Answer, Model.PossibleAnswers, new { style = "font-size: small;" })
</td>
<td>
@Html.Raw(question.Question)
</td>
</tr>
}
它看起来像这样:
答案 0 :(得分:1)
您应该使用editortemplates
这可以应用如下:
将您可能的答案移至SurveyQuestionClass。然后你可以像这样指定一个editortemplate:
@model SurveyQuestionClass
<tr>
<td>
@Html.DropDownListFor(m => m.Answer, Model.PossibleAnswers, new { style = "font-size: small;" })
</td>
<td>
@Html.Raw(Model.Question)
</td>
</tr>
Editortemplates是partialviews,应放在views文件夹的EditorTemplates文件夹中。因此,如果这适用于您的主视图,则模板应位于:views&gt;主页&gt; EditorTemplates。
Editortemplates应命名为type.cshtml。所以在你的情况下:SurveyQuestionClass.cshtml
在您看来,这导致简单:
@Html.EditorFor(m => m.QuestionsAnswers)
当您在控制器功能中重新获得模型时,所有问题和答案都将绑定到QuestionsAnswers列表。迭代列表并阅读SurveyQuestionClass.Answer属性,将为您提供问题答案