ASP.NET MVCの検証ターミネーター編

28697 ワード

时には、多くの人が具体的な技术の细部を书くのがそんなに复雑だと思います.私は必要ないと思います.多くの人が雾の水を作っています.あなたは他の人に使うことを教えることができます.具体的な细部はMSDNなどを调べることができます.アインシュタインの名言を使っています.ネットで调べられるものは覚えないでください.使う时に持ってきてください.応用面の東東は、深く研究する必要はありません.本当の核心はすでに大ひげの外国人たちに解決されています.あなたは東東を理解したいと言っています.それでは、あなたの時間を構造と管理に使うことができます.あるいは、あなたもコンパイラ(swift言語をやっているやつはこれを探しています)を作ることができます.金融をしたり、妹を研究したりすることができます.抽象的なプログラミングに向いているとよく言われますが、はっきり言えば低層は上層部に依存しなければならないので、ハイエンドの東東東を研究するのは後で役に立ちます.
本題に戻り、MVC検証が始まるが、この1編だけは、いくらでも話してほしい.
一、データ注釈特性に基づく検証
SO EASY:
A、データ注釈特性を使用するには、using Systemという名前空間を導入する必要があります.ComponentModel.DataAnnotations;
このネーミングスペースはSystemではないことに注意してください.Webで始まるのは、Webプロジェクトだけでなく、他のタイプのプロジェクトでも使用できることを示しています.
たとえば、登録用のmodelについて、プロパティ検証を使用します.
using System.ComponentModel.DataAnnotations;
namespace
Ctrip.Models { public class Register { [Required(ErrorMessage=" ")] [MinLength(6,ErrorMessage=" ")] public String UserName { get; set; } [DataType(DataType.Password)] public String Password { get; set; } [DataType(DataType.Password)] [Compare("Password",ErrorMessage=" ")] public String RptPassword { get; set; } public String Email { get; set; } public DateTime BirthDate { get; set; } }
}

注意:エラーメッセージはプレースホルダを使って、メリットを体得することもできます.
[Required(ErrorMessage=”Your {0} is required.”)]



public string Name { get; set; }

 
B、viewでHtmlHelperの方法でクライアント検証を実現できる(クライアント検証を開くことを前提とする)
@Html.ValidationSummary()はすべての検証エラーを出力し、一般的にFormヘッダに@Htmlを配置します.ValidationMessageFor()は、単一の入力に対する検証です.
次の形式になります.
@using (Html.BeginForm()) { 

    @Html.AntiForgeryToken() 

    @Html.ValidationSummary()



    <fieldset> 

        <legend>Registration Form</legend> 

        <ol> 

            <li> 

                @Html.LabelFor(m => m.UserName) 

                @Html.EditorFor(m => m.UserName) 

                @Html.ValidationMessageFor(m => m.UserName) 

            </li> 

            <li> 

                @Html.LabelFor(m => m.Password) 

                @Html.EditorFor(m => m.Password) 

                @Html.ValidationMessageFor(m => m.Password) 

            </li> 

             <li> 

                @Html.LabelFor(m => m.Email) 

                @Html.TextBoxFor(m => m.Email) 

                @Html.ValidationMessageFor(m => m.Email) 

            </li> 

            <li> 

                @Html.LabelFor(m => m.BirthDate) 

                @Html.EditorFor(m => m.BirthDate) 

                @Html.ValidationMessageFor(m => m.BirthDate) 

            </li> 

            </ol> 

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

    </fieldset> 

}

このときバックエンドを処理しなければ、クライアントがJSの実行を許可すれば、クライアントで検証できますし、AJAX検証ですよ、説明しません~
メモ:クライアント検証はどこでオンとオフになりますか?Webでconfigの中で、true or false、あなたは計算します!
<appSettings> 

   <add key="ClientValidationEnabled" value="false" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>

C、バックエンド検証を行う
一部の人はコントローラの中で専門のValid()方法の検証を書くと言って、私はこれが死ぬリズムではないと言って、肉があって豆腐を食べますか?ほほほ、次のようなことを言っています.IsValid
[HttpPost] 

      public ActionResult Create(Register register) 

      { 

          if (ModelState.IsValid) 

          { 

   return RedirectToAction("Index", "Home"); 

          } 

          return View(register); 

      } 

D、検証の特性は特に多くて、見たい自分でインターネットを利用して調べて、あるいは上のあのネーミング空間を逆コンパイルして見ることができます!しかし、2つの特性が特殊で、Systemです.Web.Mvcネーミングスペースの奥:RemoteAttributeとCompareAttribute、CompareAttributeの使い方上のAにありますが、次はRemoteAttributeの例を挙げます.私たちがサイトに登録するときに、ユーザー名を繰り返してはいけないことを要求します.このRemoteAttributeで実現することができます.非同期です.
public class Employee

{

      public int EmpId { get; set; }

      [DisplayName("Employee Name")]

      [Remote("IsEmployeeNameAvailable", "Validation")] //  RemoteAttribute,     Controller Action

      public String EmployeeName { get; set; }



}

それからアクションを書けばいいです.簡単なのでここでは書きません.警告:このRemoteAttributeはクライアント検証のみを行い、サーバ側は検証しないので、あるユーザーがクライアントjsを遮断した場合は役に立たない
注意:正規表現のプロパティも便利です.たとえば、次のようになります.
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”,ErrorMessage=”Email doesn’t look like a valid email address.”)]

具体的な正規表現はインターネットで検索できます.
二、カスタムデータ注記特性検証
 
まず二重検証とは何ですか?
実はクライアント検証とサーバ側検証です~
なぜ二重検証するのですか?
まず、クライアント検証はお客様に直接応答することができ、サーバの圧力を減らすと同時にユーザー体験を高めることができますが、クライアントからの情報(ユーザーはブラウザのスクリプト機能をオフにすることができ、js検証を完全に機能させません)を信頼することはできません.サーバ側検証も必要です.
一般的な検証は、上記のシステムで事前に定義されたValidationAttributeプロパティによって行うことができますが、カスタムValidationAttributeプロパティを作成することで特別な検証を解決する必要がある場合が多く、これらのカスタムプロパティは多くの場所で再利用できます.
ValidationAttributeの中を書き換える方法IsValid()が必要です
栗を挙げます.
using System.ComponentModel.DataAnnotations;

using System.Text.RegularExpressions;



namespace MvcValidation.Extension

{

    public class EmailAttribute : ValidationAttribute

    {

        public const string reg = @"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$";



        public EmailAttribute()

        {  

        }



        //      

        public override bool IsValid(object value)

        {

            if (value == null)

                return true;



            if (value is string)

            {

                Regex regEx = new Regex(reg);

                return regEx.IsMatch(value.ToString());

            }

            return false;

        }

    }

}

使うと、次のようになります.
[Email]

 public string Email { get; set; }

注:この時点でのカスタム検証プロパティはバックエンド検証のみをサポートします.フロントエンドjquery検証をサポートするには、IClientValidatableインタフェースも必要です.
 
書き直します
using System.ComponentModel.DataAnnotations;

using System.Text.RegularExpressions;

using System.Web.Mvc;



namespace MvcValidation.Extension

{

    public sealed class EmailAttribute : ValidationAttribute, IClientValidatable

    {

        public const string reg = @"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$";



        public EmailAttribute()

        {  

        }



        //      

        public override bool IsValid(object value)

        {

            if (value == null)

                return true;



            if (value is string)

            {

                Regex regEx = new Regex(reg);

                return regEx.IsMatch(value.ToString());

            }

            return false;

        }



        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)

        {

            ModelClientValidationRule rule = new ModelClientValidationRule

            {

                ValidationType = "email",

                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())

            };

            yield return rule;

        }

    }

}

 
 
 
注意:ValidationTypeプロパティの値は必ず小文字で書かなければなりません.そうしないと、エラーが発生します.
 
実はまだ終わっていませんが、JQuery関数(jQuery.validator.email.jsファイル)を拡張します.
//    

$.validator.addMethod("email", function (value, element) {

    if (value == false) {

        return true;

    }

    this.optional(element) || /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$/i.test(value);

});



//      

$.validator.unobtrusive.adapters.addBool("email");

IClientValidatableを実装すると、フロントエンドのEmail入力inputラベルにdata-val-emailプロパティが追加されます.プロパティの「email」はValidationType=「email」の名前です.
 
三、自己検証モデル
適用シーン:検証ロジックを再利用する必要はありません.特定のモデルのみを検証します.
これらの自己検証モデルは、「System.ComponentModel.DataAnnotations」ネーミングスペースの下で定義されたインタフェースIValidatableObjectを実現する.
 
public interface IValidatableObject

{

    IEnumerable<ValidationResult> Validate(  ValidationContext validationContext);

}

 
栗を挙げます.
public class Person: IValidatableObject

{

    [DisplayName("  ")]

    public string Name { get; set; }

    [DisplayName("  ")]

    public string Gender { get; set; }

    [DisplayName("  ")]

    public int? Age { get; set; }

    public IEnumerable<ValidationResult> Validate( ValidationContext validationContext)

    {

        Person person = validationContext.ObjectInstance as Person;

        if (null == person)

        {

            yield break;

        }

        if(string.IsNullOrEmpty(person.Name))

        {

            yield return new ValidationResult("'Name'     ", new string[]{"Name"});

        }

        if (string.IsNullOrEmpty(person.Gender))

        {

            yield return new ValidationResult("'Gender'     ", new string[] { "Gender" });

        }

        else if (!new string[]{"M","F"}.Any( g=>string.Compare(person.Gender,g, true) == 0))

        {

            yield return new ValidationResult("  'Gender'   'M','F'  ",   new string[] { "Gender" });

        }

        if (null == person.Age)

        {

            yield return new ValidationResult("'Age'     ",    new string[] { "Age" });

        }

        else if (person.Age > 25 || person.Age < 18)

        {

            yield return new ValidationResult("'Age'   18 25    ",    new string[] { "Age" });

        }            

    }

}

 
四、カスタム検証のエラーメッセージ
カスタム検証プロパティでFormatErrorMessageメソッドを書き換えることで実現します.
 
 
using System.ComponentModel.DataAnnotations;

using System.Text.RegularExpressions;

using System.Web.Mvc;



namespace MvcValidation.Extension

{

    public sealed class EmailAttribute : ValidationAttribute, IClientValidatable

    {

        public const string reg = @"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$";



        public EmailAttribute()

        {  

        }



        //      

        public override bool IsValid(object value)

        {

            if (value == null)

                return true;



            if (value is string)

            {

                Regex regEx = new Regex(reg);

                return regEx.IsMatch(value.ToString());

            }

            return false;

        }



        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)

        {

            ModelClientValidationRule rule = new ModelClientValidationRule

            {

                ValidationType = "email",

                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())

            };

            yield return rule;

        }

/// <summary>        

///                

/// </summary>        

/// <param name="name">   </param>        

/// <returns></returns>        

        public override string FormatErrorMessage(string name)        
{ return this.ErrorMessage ?? string.Format("{0} Email", name);
} } }

 
最後に、いくつかの検証はJQueryで実現することができて、基本的にjsの東に属して、ここではもう述べません~
本人はMVCの検証についても一二のことを知っているだけなので、これだけ書いておきましょう.