-1

フォームが最初に表示されているときに、質問とその回答を表示します。回答用の複数のラジオボタンを表示します。そのため、ユーザーは 1 つの回答しか選択できません。フォームとアクション メソッドの呼び出しを送信すると、問題が発生します。フォーム投稿後、回答モデルが null になっているのを見ました。したがって、フォームが投稿されるときに結果の回答モデルがnullにならないようにコードを記述する方法を教えてください。

これが完全なコードです。コードを確認してください。結果として変更が必要な場合は、フォームがアクション メソッドに投稿されるときに応答モデルが null にならないことがあります。

私のViewModelsコード

namespace ViewModels
{
    public class Question
    {
        public int ID { set; get; }
        public string QuestionText { set; get; }

        public List<Answer> Answers { set; get; }
        [Required]
        public string 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>();
        }
    }
}

controller code

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

 [HttpPost]
        public ActionResult Index(Evaluation model)
        {
            if (ModelState.IsValid)
            {
                foreach (var q in model.Questions)
                {
                    if(q.Answers==null)
                    {
                        // Answers is null
                    }
                    var qId = q.ID;
                    var selectedAnswer = q.SelectedAnswer;
                    // Save the data 

                }
                return RedirectToAction("ThankYou"); //PRG Pattern
            }
            //reload questions
            return View(model);
        }

index.cshtml code

@model ViewModels.Evaluation
<h2>Quiz 24</h2>
@using (Html.BeginForm())
{
    @Html.EditorFor(x=>x.Questions)
    <input type="submit" />
}

and view code which is stored in EditorTemplates folder

@model ViewModels.Question
<div>
    @Html.HiddenFor(x=>x.ID)
    <h3> @Model.QuestionText </h3>

    @foreach (var a in Model.Answers)
    {
        <p>
            @Html.RadioButtonFor(b=>b.SelectedAnswer,a.ID)  @a.AnswerText 
        </p>

    }
</div>

問題はここにあります

 [HttpPost]
        public ActionResult Index(Evaluation model)
        {
            if (ModelState.IsValid)
            {
                foreach (var q in model.Questions)
                {
                    if(q.Answers==null)
                    {
                        // Answers is null
                    }
                    var qId = q.ID;
                    var selectedAnswer = q.SelectedAnswer;
                    // Save the data 

                }
                return RedirectToAction("ThankYou"); //PRG Pattern
            }
            //reload questions
            return View(model);
        }

フォームを投稿すると、q.Answers==null が null になります。フォームがアクションに投稿され、Answers が null になるような方法でコードを記述する方法を知りたいです。Answers は常に null になるため、モデルを手動で再構築する必要があると多くの人が言いました。MVCには、すべてのデータを保持し、フォームが投稿されるときにモデルに適切に逆シリアル化するメカニズムはありませんか?

4

1 に答える 1