2012-04-19 52 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