2012-08-13 32 views
6

MVC 4データアノテーションを使用してカスタム検証を作成しようとしていますが、私たちが作成しているバリデーションは制限的検証以外のメッセージプロンプトです。 まず、ValidationAttribute クラスを継承し、IsValid()メソッドをオーバーライドしてデータをテストし、有効でない場合はValidationResultを返すカスタム検証クラスをいくつか作成しました。このデータを表示する ビューは、カミソリを表示するためにEditorTemplatesを使用して部分的なビューは、当社のカスタムデータアノテーションを使用してデータを生成しており、多くの検証に建てられ、このすべては、私たちの要求ができるようにしているこのMVC 4カスタムデータアノテーション手動jquery検証コール

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) 

状に包まれていますユーザーは、そのフォームに CSSクラスを使用してポストバックがそう

<input type="submit" value="Save" class="cancel"/> 

のようにこのすべてが正常に動作しているが、我々が今持ってできるように、提出されたデータをポストバックし、部分的にフォームを保存しますが、無効なフィールドにそれらを促しすべてのエラーメッセージをページに表示するための要件私はそれを試してみましたまで、私は問題があることを見ませんでしたロード...

私はここに

Manual form validation in MVC 3 and JQuery見られるように、フォームの有効なメソッドと呼ば$(ドキュメント).readyイベントにjqueryのを使用し、いくつかの例を見つけました

しかし、これは$( 'form')には当てはまりませんでした。Validate()は何もしていないようですが、フォーム検証を呼び出すような呼び出しは $( 'form')です。 () これは、[必須]属性などの組み込み検証を表示するように見えるだけで、表示するカスタム検証メッセージを取得する唯一の方法は、送信ボタンを使用してポストバックすることですフォーム。

最初にページをポストバックすることなくメッセージを表示するためにカスタムデータアノテーションを取得する方法が必要ですか? ご協力いただければ幸いです。

答えて

6

だから私は望んでいたよりも少し仕事があったと思っていましたが、結果を得る方法を見つけました。 私が見落としていたものは、私のカスタム検証クラスにIClientValidatableを暗示していなかったし、jlery Validator addmethodにカスタム検証を追加しなければならなかった。IClientValidatableをカスタム検証クラスに組み込み、あなたはすべてのjQueryのものが設定していると仮定すると、この作業イムを取得する方法/

を含めて

まずカスタム検証を使用した簡単なモデルを作成属性

public class Person 
{ 
    [Required] 
    [Display(Name="Name")] 
    public string Name { get; set; } 
    public int Age { get; set; } 

    //Uses a custom data annotation that requires that at lease it self or the property name passed in the constructor are not empty 
    [OneOfTwoRequired("Mobile")] 
    public string Phone { get; set; } 
    [OneOfTwoRequired("Phone")] 
    public string Mobile { get; set; } 
} 

プロパティを取得するためにリフレクションを使用してカスタム検証クラステストに渡された文字列名のうち

/08/2012のよう

注:あなたがMVC 4を使用している場合ModelClientValidationRuleは何が

public class OneOfTwoRequired : ValidationAttribute, IClientValidatable 
    { 
     private const string defaultErrorMessage = "{0} or {1} is required."; 

     private string otherProperty; 

     public OneOfTwoRequired(string otherProperty) 
      : base(defaultErrorMessage) 
     { 
      if (string.IsNullOrEmpty(otherProperty)) 
      { 
       throw new ArgumentNullException("otherProperty"); 
      } 

      this.otherProperty = otherProperty; 
     } 

     public override string FormatErrorMessage(string name) 
     { 
      return string.Format(ErrorMessageString, name, otherProperty); 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      PropertyInfo otherPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(otherProperty); 

      if (otherPropertyInfo == null) 
      { 
       return new ValidationResult(string.Format("Property '{0}' is undefined.", otherProperty)); 
      } 

      var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null); 

      if (otherPropertyValue == null && value == null) 
      { 
       return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
      } 

      return ValidationResult.Success; 
     } 
     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
       //This is the name of the method aaded to the jQuery validator method (must be lower case) 
       ValidationType = "oneoftworequired" 
      }; 

     } 
    } 
MVC 4に存在するように見えるしませんよう、あなたはIClientValidatableの使用System.web.mvc 3.0を参照のする必要があります。

これをビューまたはパーシャルビューに追加するには、これが$(ドキュメント)にないことを確認する必要があります。あなたが戻って掲示することなく、または最初のページの読み込み時にフォームを検証するために、あなただけの($を呼び出すことを行いたい場合は準備の方法は

jQuery.validator.addMethod("oneoftworequired", function (value, element, param) { 
     if ($('#Phone).val() == '' && $('#Mobile).val() == '') 
      return false; 
     else 
      return true; 
    }); 

    jQuery.validator.unobtrusive.adapters.addBool("oneoftworequired"); 

jQueryのバリのもののみを必要としているようですこれは誰かに役立ちます「形式」)。有効()

希望:)

0

なぜスクリプトコードが「#Phone」と「#Mobile」のidの持つフィールドに特異的に結びついている間、あなたのC#コードの一般的には任意の二つの分野に適用可能な、ありますか?スクリプトを一般化する方法はありませんか?

+0

errはいもっと一般的なスクリプトを使うことができましたが、これは1ページあたり1つの携帯電話1つの要素しか持たないケースだったので、一般的ですが、if($( '。 val()== '' && $( '。Option2')。val()== '')、それはもっと一般的なものになります。 – Troublesum

関連する問題