嵌套for循环 - RadioButtonFor not working

时间:2012-04-19 18:57:03

标签: c# asp.net-mvc asp.net-mvc-3 linq razor

我在视图中嵌套了foreach循环,并且我遇到了单选按钮的问题。

@foreach (var header in Model.surveyHeaders)
{
    <h1>@header.Name</h1>

foreach (var subHeader in Model.surveySubHeaders.Where(x => x.SurveryHeaderID == header.ID))
{
<h2>@subHeader.Name</h2>

    foreach (var question in Model.surveyQuestions.Where(x => x.SurveySubHeaderID == subHeader.ID))
    {
        @Html.RadioButtonFor(x => x.surveyResults.Where(y => y.SurveyQuestionID == question.ID).First().Value, 1);
        @Html.RadioButtonFor(x => x.surveyResults.Where(y => y.SurveyQuestionID == question.ID).First().Value, 2);
        @Html.RadioButtonFor(x => x.surveyResults.Where(y => y.SurveyQuestionID == question.ID).First().Value, 3);            
        @question.Question
    }
}

}

单选按钮名称始终为“值”,因此单选按钮不会分组。如何实现所需的分组?

2 个答案:

答案 0 :(得分:3)

MVC中的啊收藏,快乐!为了确保所有字段都相应地命名以便在帖子上正确地进行模型绑定,您需要使用for循环,这将正确设置索引。

在这样做之前,您将不得不调整模型结构以避免头痛。您需要重新排列逻辑,以便拥有一个分层对象模型,您可以在其中迭代更清晰(这样我们也可以远离视图中的逻辑!)

您的调查标题类,您不能在其上放置一个子标题列表吗?然后你的子标题类,你能把那个子标题的问题列表?这样你就可以做到:

@for (var i = 0; i < Model.SurveyHeaders.Count; i++)
{
    <h1>@Model.SurveyHeaders[i].Name</h1>

    for (var j = 0; j < Model.SurveyHeaders[i].SubHeaders.Count; j++)
    {
        <h2>@Model.SurveyHeaders[i].SubHeaders[j].Name</h2>

        for (var k = 0; k < Model.SurveyHeaders[i].SubHeaders[j].Questions.Count; k++)
        {
            @Html.RadioButtonFor(x => x.SurveyHeaders[i].SubHeaders[j].Questions[k].Value , 1);
            @Html.RadioButtonFor(x => x.SurveyHeaders[i].SubHeaders[j].Questions[k].Value , 2);
            @Html.RadioButtonFor(x => x.SurveyHeaders[i].SubHeaders[j].Questions[k].Value , 3);            
            @Model.SurveyHeaders[i].SubHeaders[j].Questions[k].Question
        }
    }
}

这假设您的新模型结构类似于(使用以下类):

public class MyModel
{
    public List<SurveyHeader> SurveyHeaders { get; set; }
}

public class SurveyHeader
{
    public string Name { get; set; }
    public List<SubHeader> SubHeaders { get; set; }
}

public class SubHeader
{
    public string Name { get; set; }
    public List<Question> Questions { get; set; }
}

public class Question
{
    public int Value { get; set; }
    public string Question { get; set; }
}

另外还有一个提示,为了将来参考,您可以在代码中使用以下LINQ:

x => x.surveyResults.Where(y => y.SurveyQuestionID == question.ID).First().Value

你可以简化它,因为First实际上可以采用lamba,就像这样(尽管你应该使用FirstOrDefault并在将来检查它以确保安全):

x => x.surveyResults.First(y => y.SurveyQuestionID == question.ID).Value

答案 1 :(得分:1)

您可以使用接收HtmlAttributes的RadioButtonFor扩展的重载并设置每个RadioButtons的名称。