1

データベースから駆動されるアンケートを表示するために使用されるネストされたビューモデルがいくつかあります。質問を表示するのは簡単ですが、モデルにバインドする方法や、送信時に選択した回答を解析する方法がわかりません。

私のオブジェクトは(疑似)のように見えます:

public class QuestionSheetViewModel(){
    public list<QuestionViewModel> Questions;
    public string UserName;
}

public class QuestionViewModel(){
    public int QuestionId;
    public string QuestionText;
    public dictionary<int, string> answers;
}

私の見解では、質問を反復処理し、各質問テキストを表示してから、各回答をラジオ ボタンとしてレンダリングします。

    @Html.RadioButton(question.QuestionID, answer.Key());

question.questionId をラジオ ボタン名として使用することで、それらがグループ化され、ユーザーは質問ごとに 1 つの回答に制限されます。

送信すると、モデルの質問リストが空です。これをビューモデルに自動的にバインドすることは可能ですか? そうでない場合、送信されたフォームを解析して、各質問に対して選択された回答を見つけるために何かを書くために何をする必要がありますか?

ありがとうございました

4

1 に答える 1

2

要件に合わせてモデルを少し調整できます。

public class QuestionSheetViewModel
{
    public List<QuestionViewModel> Questions { get; set; }
    public int QuestionId { get; set; }
}

public class QuestionViewModel
{
    public string QuestionText { get; set; }
    public int SelectedAnswerId { get; set; }
    public List<AnswerViewModel> Answers { get; set; }
}

public class AnswerViewModel
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
}

そしてコントローラーを用意します:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new QuestionSheetViewModel
        {
            QuestionId = 1,
            Questions = new[] 
            { 
                new QuestionViewModel
                {
                    QuestionText = "question 1",
                    SelectedAnswerId = 2,
                    Answers = new[] 
                    {
                        new AnswerViewModel { AnswerId = 1, Text = "answer 1" },
                        new AnswerViewModel { AnswerId = 2, Text = "answer 2" },
                    }.ToList()
                },
                new QuestionViewModel
                {
                    QuestionText = "question 2",
                    SelectedAnswerId = 3,
                    Answers = new[] 
                    {
                        new AnswerViewModel { AnswerId = 3, Text = "answer 3" },
                        new AnswerViewModel { AnswerId = 4, Text = "answer 4" },
                    }.ToList()
                },
            }.ToList()
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(QuestionSheetViewModel model)
    {
        // When the form is submitted the model will be properly bound
        return View(model);
    }
}

対応するビュー ( ~/Views/Home/Index.cshtml):

@model QuestionSheetViewModel

@using (Html.BeginForm())
{ 
    @Html.HiddenFor(x => x.QuestionId)
    <ul>
        @Html.EditorFor(x => x.Questions)
    </ul>
    <button type="submit">OK</button>
}

および対応するエディター テンプレートは、規則に従って各質問に対して自動的にレンダリングされます ( ~/Views/Shared/EditorTemplates/QuestionViewModel.cshtml):

@model QuestionViewModel

<li>
    @Html.DisplayFor(x => x.QuestionText)
    @Html.HiddenFor(x => x.QuestionText)
    <ul>
        @for (int i = 0; i < Model.Answers.Count; i++)
        {
            <li>
                @Html.HiddenFor(x => x.Answers[i].AnswerId)
                @Html.HiddenFor(x => x.Answers[i].Text)
                @Html.RadioButtonFor(x => x.SelectedAnswerId, Model.Answers[i].AnswerId)
                @Html.DisplayFor(x => x.Answers[i].Text)
            </li>
        }
    </ul>
</li>
于 2013-04-03T16:00:55.837 に答える