2012-05-14 20 views
1

私は、いくつかの詳細とリンクを表示するためのリンクとそれらを編集するためのリンクを持つ項目(ヘッダ項目)のリストが必要なページを持っています。さらに、リストの最上部には、基本的な詳細(開始日と終了日)を取得し、そのデータを使用して新しいヘッダー項目を作成するフォームが必要です。私がやった何MVC3サブフォームの検証

  • は、ヘッダ制御
  • を作成したが、インデックスビュー(項目のリストを取得します)
  • がstartHeaderビューを作成作成した(、開始と終了日をフォームを持っており、ボタン、形態「のaddHeader」のactionNameのを有する)
  • インデックスビュー
  • に部分図としてstartHeaderビューを追加し、開始日と終了日は、「ValidationMessageFor」を追加

いくつかの検証を除いて、すべてが一般的に動作しているようです。必要なフィールドの検証が正常に機能しているようです(つまり、開始日を入力せずにボタンをクリックすると「開始日が必要です」と表示されます)。私が動作しているように思われないいくつかの追加の検証を追加しましたしかし

は:

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

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

  • ボタンが押されたときに
  • 予想通り、このコードが実行されますが、それはインデックス画面に滞在し、検証メッセージ
  • は表示されません。むしろ、それは私が持っていたのaddHeaderビュー
  • に通過しますこれが必要なフィールド検証と同じように動作し、検証メッセージを表示すると期待しました

ここに何か不足していますか?

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

答えて

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が表示されます。 See this for more details.

+0

バックエンドの.IsValidは、不足していたようですが、ありがとう! – ChrisHDog

関連する問題