1

私は単純な質問データモデルを持っています:

public class Question {
    int QuestionId { get; set; }
    string Text { get; set; }
    string Answer { get; set; }
    string ValidationMessage { get; set; }
};

このクラスを使用して、ビュー モデルを作成しました。

public class QuestionViewModel {
    string Introduction { get; set; }
    IEnumerable<Question> Questions { get; set; }
};

私のコントローラーは、(データソースから)ビューモデルを構築し、ビューをレンダリングします:

@model QuestionViewModel

@using (Html.BeginForm()) {
    if (Model.Questions != null) {
        <ol>
            @Html.EditorFor(m => Model.Questions)
        </ol>
    }
    @Html.ValidationSummary("Unable to process answers...")

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

このビューは EditorTemplate を利用します。

@model Question

<li>
    @Html.HiddenFor(m => m.Questionid)
    @Html.TextBoxFor(m => m.Answer)
    @Html.ValidationMessageFor(m => m.Answer)
</li>

今のところ、ページがポストバックされると、コントローラーは応答を検証します。

[HttpPost]
public ActionResult Response(QuestionViewModel model) {
    if (ModelState.IsValid) {
       for (int i = 0; i < model.Questions.Count(); i++) {
           Question q = model.Questions[i];
           string questionId = String.Format("Questions[{0}]", i);

           if (String.IsNullOrWhiteSpace(q.Answer)) {
               ModelState.AddModelError(questionId, q.ValidationMessage);
           }
       }
    }
}

私が抱えている問題は、これのほとんどが正常に機能することです-検証と検証の概要に正しい検証メッセージが表示されます。問題は、エラーをレンダリングする個々のフィールド バリデータを取得できないことです。

<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Questions[0].StringValue"></span>

ご覧のとおり、ModelState.AddModelError() メソッドを呼び出すと、現在「Questions[0]」形式のキー値を使用していますが、「Questions_0」やその他のさまざまな組み合わせも試しました。

ヘルプ/ガイダンスをいただければ幸いです。

【長文失礼しました】

4

1 に答える 1

0

私は答えを見つけました - 非常に多くのものと同様に、問題を分解すると明らかでした - ModelState.AddModelError() には完全修飾キーが必要でした!

HttpPost コントローラーを次のように変更します。

[HttpPost]
public ActionResult Response(QuestionViewModel model) {
    if (ModelState.IsValid) {
       for (int i = 0; i < model.Questions.Count(); i++) {
           Question q = model.Questions[i];

           /*
           ** The key must specify a fully qualified element name including
           ** the name of the property value, e.g.
           ** "Questions[0].Answer"
           */
           string questionId = String.Format("Questions[{0}].Answer", i);

           if (String.IsNullOrWhiteSpace(q.Answer)) {
               ModelState.AddModelError(questionId, q.ValidationMessage);
           }
       }
    }
}
于 2011-06-27T17:33:33.703 に答える