0

MVC4アプリのコントローラーに投稿された小さな多肢選択式質問票から値を取得するのに苦労しています。

モデルは次のようになります。

public class Evaluation
{
    public int Id { get; set; }    
    public IEnumerable<MultipleChoiceQuestion> Question { get; set; }    
    public Remark Rem { get; set; }
}

public class MultipleChoiceQuestion
{
    public int Id { get; set; }    
    public string Question { get; set; }    
    public MultipleChoiceAnswer Answer { get; set; }
}

public enum MultipleChoiceAnswer
{
    DISAGREE,
    NEUTRAL,
    AGREE,
    NA,
}

これはビューです(マークアップをいくつか省略しています):

@model Models.Evaluation

@using (Html.BeginForm("EvaluationB", "Evaluation", FormMethod.Post))
{
        @foreach (var item in Model.Question)
            {
                @Html.DisplayFor(model => item.Question)
                @Html.EditorFor(model => item.Question, "Enum_RadioButtonList", new { Id = item.Id })
            }
            @Html.Label("Remark")
            @Html.TextAreaFor(model => model.Rem)

                <input type="submit" value="Next" />
}

「Enum_RadioButtonList」は、https ://gist.github.com/973482から取得したビューです。列挙型の値をラジオボタンリストに表示するのに最適な方法のようです(MVC 4ではそれらの方が簡単な方法です)

コントローラは次のようになります。

    public ActionResult EvaluationA()
    {
        Models.Evaluation evm = new Models.Evaluation();
        evm.Question = db.MultipleChoiceQuestions.ToList(); //feeding the View some predefined questions
        return View(evm);
    }

    public ActionResult EvaluationB(Models.Evaluation ev)
    {
        if (ModelState.IsValid)
        {
            // TODO: save model
            return View("EvaluationB", evm);
        }

        return View("EvaluationA", ev);
    }

質問はビューに正常に読み込まれますが、何らかの理由で、コントローラーに投稿されたモデルはHttpPostの後も空のままであり、その理由がわかりません。

4

2 に答える 2

0

フォームに以下のようなIDのマッピングが含まれているのがわかりませんでした。

@Html.HiddenFor(model => model.Id)

フォームと一緒に投稿されるように、質問の内部コレクションのそれぞれにもIDが必要です。したがって、各質問のフォームのforeachループ内では、次のようになります。

@Html.HiddenFor(model => item.Question.Id)

また、モデルには、MultipleChoiceQuestionタイプのコレクションがあります。コレクションにモデルをバインドする場合、コレクション要素の名前には、この投稿http://haacked.com/archive/2008/10/23/model-binding-to-a-listで説明されているように、順序付けられた番号を持つname属性が必要です。 aspx

于 2012-12-27T08:52:18.567 に答える
0

私はこの投稿に出くわしたいくつかのさらなる研究をしました:

http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

問題は、htmlフィールドの命名にありました。このようにビューを追加しました。これで、コントローラーの値を正しく読み取ることができます。

    @for (int i = 0; i < 6; i++)
    {
    <tr>
        <td>
            @Html.DisplayFor(m => m.Question[i].Question)
        </td>
        <td class="mult_question">
            @Html.EditorFor(m => m.Question[i].Answer, "Enum_RadioButtonList" )
        </td>
    </tr>
    }

<tr>
    <td>
        @Html.Label("Remark")
        @Html.TextAreaFor(m => m.Remark)
于 2012-12-27T12:43:58.227 に答える