2

クイズに使用する次のモデルがあります。フォームを送信して、既存のモデルをアクションに戻そうとしています。これは、インデックス アクションで既に初期化されているためです。

public class QuizModel
{
    private List<string> _Responses;

    public List<string> Responses
    {
        get
        {
            if (_Responses == null)
            {
                _Responses = new List<string>() { "Response A", "Response B", "Response C", "Response D" };
            }
            return _Responses;
        }
    }

    public int? SelectedIndex { get; set; }

    public string Question { get; set; }
}

次のビューを使用します。

<div class="title">Question</div>
<span id="question">@Model.Question</span>
@if (!Model.UserHasAnswered)
{
using (Html.BeginForm("Submit", "Quiz", FormMethod.Post))
{
    for (int i = 0; i < Model.Responses.Count; i++)
    {
        <div class="reponse">@Html.RadioButtonFor(m => m.SelectedIndex, i)@Model.Responses[i]</div>
    }
    <input type="submit" value="This is the value" />                              
}
}
else
{
    <div id="explanation">@Model.Explanation</div>
}

そしてコントローラ...

//
    // GET: /Quiz/

    public ActionResult Index()
    {
        QuizModel model = new QuizModel()
        {
            Question = "This is the question",
            Explanation = "This is the explanation",
            UserHasAnswered = false
        };

        return PartialView(model);
    }

    //
    // POST: /Quiz/Submit
    [HttpPost]
    public ActionResult Submit(QuizModel model)
    {
        if (ModelState.IsValid)
        {
            int? selected = model.SelectedIndex;

            model.UserHasAnswered = true;
        }

        return View("Index", model);
    }

モデルが送信アクションになると、SelectedIndex のみが含まれ、質問または説明のプロパティは含まれません。受信した元のモデルを送信アクションに戻すようにビューに指示するにはどうすればよいですか?

4

2 に答える 2

3

最初にインデックスを表示すると、質問と説明が正しく表示されます。次に、フォームを送信すると、質問と説明がコントローラー アクションに到達しません。

これは、フォームに質問と説明を含む入力フィールドがないためです。

これをフォームに追加します。

@Html.HiddenFor(x => x.Question)
@Html.HiddenFor(x => x.Explanation)

ユーザーが説明を編集できる場合は、非表示を追加する代わりに、次のようにします。

@Html.TextAreaFor(x => x.Explanation)

覚えておいてください: コントローラーに送信する必要があるすべての情報は、FORM 内の INPUTS にある必要があります。

このようにして、ビューは次のようになります。

<div class="title">Question</div>
<span id="question">@Model.Question</span>
@if (!Model.UserHasAnswered)
{
using (Html.BeginForm("Submit", "Quiz", FormMethod.Post))
{
    @Html.HiddenFor(x => x.Question)
    @Html.HiddenFor(x => x.Explanation)
    for (int i = 0; i < Model.Responses.Count; i++)
    {
        <div class="reponse">@Html.RadioButtonFor(m => m.SelectedIndex, i)@Model.Responses[i]</div>
    }
    <input type="submit" value="This is the value" />                              
}
}
else
{
    <div id="explanation">@Model.Explanation</div>
}
于 2013-09-28T17:20:29.643 に答える
0

あなたのシナリオでは、あなたのindex行動は以下のようになるはずです:

public ActionResult Index(QuizModel model)
{
    if(model == null) 
    {
        model = new QuizModel()
        {
            Question = "This is the question",
            Explanation = "This is the explanation",
            UserHasAnswered = false
        };
    }

    return PartialView(model);
}

これが役立つことを願っています!!

于 2013-09-28T16:20:19.890 に答える