3

質問を評価するためのページを作成しています。

ビューでは、質問のリストと、それぞれの前に5つのラジオボタンがあります。

<input name="evalId" type="hidden" value="@Model.Evaluation.EvalId" />
foreach (var question in questionList)
{
     <input name="questionId" type="hidden" value="@question.QuestionId" />
     <div class="row_star" style="border-bottom : 0 none; background: none;">
       @if (!String.IsNullOrEmpty(question.QuestionTitre))
       {
         <p>@question.QuestionTitre.TrimEnd()</p>
       }

       @* here goes the code for 5 radio buttons*@
}

ここで、私のコントローラーで、質問ごとにどのラジオボタンがチェックされたかを知りたいと思います。

どうやってやるの ?

これが私のViewModelです

public class EvaluationViewModel
{
    /// <summary>
    /// 
    /// </summary>
    public EvalEvaluation Evaluation
    {
        get;
        set;
    }

    /// <summary>
    /// 
    /// </summary>
    public Dictionary<EvalQuizz, List<EvalQuestion>> EvalQuizzQuestionList
    {
        get;
        set;
    }
}
4

1 に答える 1

6

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モデルバインディングに感謝します:) ここに画像の説明を入力してください

あなたはそれについて読んで、ここで実用的なサンプルをダウンロードすることができます。

于 2012-10-11T17:47:44.217 に答える