1

ビューで 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
    }
}

}

ラジオ ボタンの名前は常に「値」であるため、ラジオ ボタンはグループ化されません。目的のグループ化を実現するにはどうすればよいですか?

4

2 に答える 2

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

また、もう 1 つのヒントとして、今後の参考のために、コードで次の LINQ を使用します。

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

First実際には次のようにランバを取ることができるため、単純化できます(ただしFirstOrDefault、将来的には安全のためにそれを使用してnullチェックする必要があります):

x => x.surveyResults.First(y => y.SurveyQuestionID == question.ID).Value
于 2012-04-19T19:23:38.757 に答える
1

HtmlAttributes を受け取り、各 RadioButton の名前を設定する RadioButtonFor 拡張機能のオーバーロードを使用できます。

于 2012-04-19T18:59:50.133 に答える