ああ、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