ViewModelが次のようになっていると仮定します
public class Question
{
public int ID { set; get; }
public string QuestionText { set; get; }
public List<Answer> Answers { set; get; }
public int SelectedAnswer { set; get; }
public Question()
{
Answers = new List<Answer>();
}
}
public class Answer
{
public int ID { set; get; }
public string AnswerText { set; get; }
}
public class Evaluation
{
public List<Question> Questions { set; get; }
public Evaluation()
{
Questions = new List<Question>();
}
}
また、GETアクションメソッドでは、いくつかの質問と回答が入力されたビューモデルをビューに戻します。以下のコードでは、質問と回答をハードコーディングしています。リポジトリ/サービスレイヤーから取得できます。
public ActionResult Index()
{
var evalVM = new Evaluation();
//the below is hardcoded for DEMO. you may get the data from some
//other place and set the questions and answers
var q1=new Question { ID=1, QuestionText="What is your favourite language"};
q1.Answers.Add(new Answer{ ID=12, AnswerText="PHP"});
q1.Answers.Add(new Answer{ ID=13, AnswerText="ASP.NET"});
q1.Answers.Add(new Answer { ID = 14, AnswerText = "Java" });
evalVM.Questions.Add(q1);
var q2=new Question { ID=2, QuestionText="What is your favourite DB"};
q2.Answers.Add(new Answer{ ID=16, AnswerText="SQL Server"});
q2.Answers.Add(new Answer{ ID=17, AnswerText="MySQL"});
q2.Answers.Add(new Answer { ID=18, AnswerText = "Oracle" });
evalVM.Questions.Add(q2);
return View(evalVM);
}
次に、質問をレンダリングするためのエディターテンプレートを作成します。したがって、ビューフォルダーに移動し、現在のコントローラー名でフォルダーの下にEditorTemplatesというフォルダーを作成します。EditorTemplatesフォルダーにビューを追加し、表現するクラス名と同じ名前を付けます。すなわち:Question.cshtml
次に、このコードをエディターtempalteに配置します
@model YourNameSpace.Question
<div>
@Html.HiddenFor(x=>x.ID)
@Model.QuestionText
@foreach (var a in Model.Answers)
{
<p>
@Html.RadioButtonFor(b=>b.SelectedAnswer,a.ID) @a.AnswerText
</p>
}
</div>
次に、メインビューに移動し、EditorTemplate htmlヘルパーメソッドを使用して、作成したEditorTemplateをメインビューに移動します。
@model YourNameSpace.Evaluation
<h2>Index</h2>
@using (Html.BeginForm())
{
@Html.EditorFor(x=>x.Questions)
<input type="submit" />
}
これで、HttpPostで、投稿されたモデルを確認し、選択したラジオボタン(SelectedAnswer)の値を取得できます。
[HttpPost]
public ActionResult Index(Evaluation model)
{
if (ModelState.IsValid)
{
foreach (var q in model.Questions)
{
var qId = q.ID;
var selectedAnswer = q.SelectedAnswer;
//Save
}
return RedirectToAction("ThankYou"); //PRG Pattern
}
//reload questions
return View(model);
}
Visual Studioブレークポイントを使用すると、投稿された値を確認できます。MVCモデルバインディングに感謝します:)
あなたはそれについて読んで、ここで実用的なサンプルをダウンロードすることができます。