绑定@foreach中的每个DropDownListFor

时间:2013-09-13 00:05:49

标签: c# asp.net-mvc

凭借我的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>
}

它看起来像这样:

enter image description here

1 个答案:

答案 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属性,将为您提供问题答案