1

アイテム (ヘッダー アイテム) のリストと詳細、表示へのリンク、およびそれらを編集するためのリンクが必要なページがあります。さらに、リストの一番上に、基本的な詳細 (開始日と終了日) を取得し、そのデータを使用して新しいヘッダー項目を作成するフォームが必要です。

私がやったこと:

  • ヘッダーコントローラーを作成しました
  • インデックス ビューを作成しました (アイテムのリストを取得します)
  • startHeaderビューを作成しました(開始日、終了日、ボタンを含むフォームがあり、フォームには「addHeader」のactionNameがあります)
  • 開始日と終了日の「ValidationMessageFor」を追加
  • startHeader ビューを部分ビューとして index ビューに追加しました

一部の検証を除いて、すべてが一般的に機能しているように見えます。必須フィールドの検証は期待どおりに機能しているようです (つまり、開始日を入力せずにボタンをクリックすると、「開始日が必要です」と表示されます)。

ただし、機能していないように見える追加の検証を追加しました。

  • IValidatableObject インターフェイスをヘッダー クラスに追加しました
  • 追加された検証コード

    if (this.StartDate > this.EndDate) { yield return new ValidationResult("開始日は終了日より前でなければなりません。", new[] { "StartDate" }); }

  • ボタンが押されると、このコードは期待どおりに実行されます
  • ただし、インデックス画面にとどまらず、検証メッセージを表示します
  • むしろ、 addHeader ビューを通過します
  • 私はこれが必須フィールドの検証と同じように機能し、検証メッセージを表示することを期待していました

私がここに欠けているものはありますか?

  • この検証が実行されているのに、エラー メッセージが表示されないのはなぜですか?
  • この検証を実行してページに残すために何かを追加する必要がありますか?
  • このようなことを行うためのより良い方法はありますか?
4

1 に答える 1

1

Unobtrusive Client Validationを介して必要なフィールドの検証が表示されている可能性があります (モデルにデータ注釈が含まれている可能性があります[Required])。この検証は JavaScript を介してクライアント側で実行されるため、サーバーにポスト バックすることはまったくありません。

対照的に、作成した検証コードは、フォームがサーバーにポストバックされた後に実行されます。addHeader() メソッドでこれをトラップする必要があります。これらの行に沿ったもの:

[HttpPost]
public ActionResult addHeader(addHeader model)
{
    if (!ModelState.IsValid)
    {
        return View();
    }
    else
    {
        //Do Work to add your header...
        return View("Index");
    }
}

ビューにある限り@Html.ValidationSummary(true)、ValidationResult が自動的に表示されます。詳しくはこちらをご覧ください。

于 2012-08-03T19:18:30.763 に答える