2012-04-19 69 views
1

我在我的视图中嵌套了foreach循环,并且在单选按钮时遇到了问题。嵌套循环 - RadioButtonFor无法运行

@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 
    } 
} 

}

单选按钮名称始终“值”,因此无线电按钮没有分组。我能做些什么来实现所需的分组?

回答

3

啊在MVC收藏,喜悦!为了确保所有字段都相应地命名以便在后期正确模型绑定,您需要使用for循环,这将正确设置索引。

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

你的调查头类,可'你把副标题列表放在上面吗?然后你的subheader类,你可以把这个子标题的问题列表?这样,你可以这样做:

@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实际上可以采取兰巴,像这样(虽然你应该使用FirstOrDefault和空检查它在未来只是为了安全):

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

非常感谢。 – Jason 2012-04-19 20:25:45

+0

没问题!很高兴我可以帮助,当我第一次遇到这种类型的问题时,我知道我需要它:) – mattytommo 2012-04-19 20:28:24

1

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

+0

我试过了。 Id可以被覆盖,但它不适用于名称。 – Jason 2012-04-19 19:02:08

+0

@Jason我仍然会使用ID – 2012-04-19 19:06:54

+0

@COLDTOLD尝试它,但是单选按钮按名称属性分组,所以它没有任何作用。 – Jason 2012-04-19 19:14:25