2012-02-19 12 views
1

ValidationAttributeから派生したカスタム検証ツールを作成しました。私の考えは、(jquery.validateを使って)自動的に検証するためのクライアント側スクリプト用の十分なメタデータを生成することです。カスタムバリデーターはサーバー側で正常に動作しています。しかし、それはクライアント側でエラーメッセージを発生させません。 ( "StringLength"のような他のデフォルトのバリデータもクライアント側でうまく動作しています)どのように修正するのですか?ValidationAttributeを使用したカスタム検証ではクライアント側の検証は実行されません

public class Person 
{ 
    [Required(ErrorMessage = "First name required")] 
    public string FirstName { get; set; } 

    [CustomStartLetterMatch("FirstName")] 
    [StringLength(5,ErrorMessage = "Must be under 5 characters")] 
    public string LastName { get; set; } 

    [Range(18,50,ErrorMessage="Must be between 18 and 50")] 
    public int Age { get; set; } 


} 


public sealed class CustomStartLetterMatch : ValidationAttribute 
{ 

    private const string _defaultErrorMessage = " First letter of '{0}' must be same as first letetr of '{1}'"; 
    private string _basePropertyName; 

    public CustomStartLetterMatch(string basePropertyName) 
     : base(_defaultErrorMessage) 
    { 
     _basePropertyName = basePropertyName; 
    } 


    //Override FormatErrorMessage Method 
    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(_defaultErrorMessage, name, _basePropertyName); 
    } 


    //Override IsValid 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     //Get PropertyInfo Object 
     var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName); 
     var baseValue = (string)basePropertyInfo.GetValue(validationContext.ObjectInstance, null); 
     var currentValue = (string)value; 


     string firstLetterBaseValue = baseValue.Substring(0, 1); 
     string firstLetterCurrentValue = currentValue.Substring(0, 1); 

     //Comparision 
     if (!string.Equals(firstLetterBaseValue, firstLetterCurrentValue)) 
     { 
      var message = FormatErrorMessage(validationContext.DisplayName); 
      return new ValidationResult(message); 
     } 

     //Default return - This means there were no validation error 
     return null; 
    } 

} 

VIEW

@model MyValidationTEST.Person 

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> </script> 

@*UnObtrusive*@ 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 




@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Person</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.FirstName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.FirstName) 
     @Html.ValidationMessageFor(model => model.FirstName) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.LastName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.LastName) 
     @Html.ValidationMessageFor(model => model.LastName) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Age) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Age) 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 



    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

<div> 
@Html.ActionLink("Back to List", "Index") 
</div> 

READING:

  1. IValidatableObject in MVC3 - client side validation

  2. In ASP.NET MVC3 how do you stay DRY with very similar but slightly different viewmodels?

  3. http://odetocode.com/Blogs/scott/archive/2011/02/22/custom-data-annotation-validator-part-ii-client-code.aspx

  4. http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

  5. ASP.NET MVC 3 client-side validation with parameters

  6. How can I have a custom ValidationAttribute rendered as a 'data-val-xx' attribute on the client-side?

  7. Clientside Validation in "Self Validate Model" in ASP.NET-MVC3

答えて

5

私undertsandngは、それが世代ということです クライアントサイドスクリプトが(jquery.validateを使用して)自動的に検証するのに十分なメタデータを削除します。

あなたの理解は間違っています。クライアントの検証を生成するのに十分なメタデータがあるとは予想できません。このIsValidメソッドでは、何かを絶対にすることができます。検証を実行するには、アンマネージC++ライブラリを呼び出すこともできます。 ASP.NET MVC 3がこれをクライアントに反映させることは期待できません。

このようなカスタム検証ロジックのクライアント検証を有効にする場合は、IClientValidatableを実装し、カスタムアダプターを追加する必要があります。このアダプターでは、サーバーでやったのと同じロジックを再実装する必要がありますが、今回はjavascriptを使用します。

ここはone exampleです。ここにはanother oneがあります。

クライアント側の検証では、Requiredやstuffなどの単純なルールで正常に動作することがわかります。実際の検証を開始したら、自分で実装する必要があります。

+0

ありがとうございました。本当にドライではありませんか? :-)それがカスタムバリデーションであるならば繰り返す必要があります。 – Lijo

+1

@Lijoはい、DRYではありません。しかしそれはそれである。このようなカスタムルールをクライアントで実装するのはどうしてですか?もちろん、絶対に必要な場合は、JavaScriptを作成する準備をしてください。 –

+0

ありがとうございます。もう1つの質問。私がSelf Validateアプローチを使用している場合、そのようなクライアントスクリプトを書くことは可能でしょうか? – Lijo

関連する問題