ASP.NET MVC의 검증 끝판왕 편

29103 단어 asp.net
때때로 나는 많은 사람들이 구체적인 기술 세부 사항을 그렇게 복잡하게 쓴다고 생각한다. 나는 필요하지 않다고 생각한다. 많은 사람들이 안개투성이가 되면 네가 다른 사람에게 가르쳐 주면 된다. 구체적인 세부 사항은 MSDN을 찾아볼 수 있고 아인슈타인의 명언을 곁들인다. 인터넷에서 찾을 수 있는 것은 기억하지 말고 사용할 때 가져오면 된다.응용 차원의 동동, 깊이 연구할 필요가 없다. 진정한 핵심은 수염이 많은 외국인들에 의해 해결되었다. 네가 굳이 어떤 동동을 이해하고 싶다면 너는 너의 시간을 구조와 관리에 쓸 수도 있다. 아니면 너도 컴파일러(swift 언어를 하는 그 녀석은 장식된 이거)를 만들 수도 있다. 금융을 하면서심지어 여동생을 당신보다 밑바닥의 기술 디테일을 연구하는 것이 낫다. 우리는 추상적인 프로그래밍을 향한다고 자주 말한다. 말하자면 낮은 층이 높은 층에 의존해야 하기 때문에 높은 층의 동쪽을 연구하는 것이 당신에게 나중에 도움이 될 것이다!
본론으로 돌아가면 MVC 검증이 시작된다. 단지 이 한 편뿐이니 얼마만큼 이야기했으면 좋겠다!
1. 데이터 주석 특성에 기초한 검증
SO EASY:
A. 데이터 주석을 사용하려면 다음과 같은 명칭 공간을 도입해야 합니다: using System.ComponentModel.DataAnnotations;
이 명칭 공간은 System이 아니라는 것을 알 수 있습니다.웹에서 시작하여 웹 프로젝트만을 위한 것이 아니라 다른 유형의 프로젝트를 모두 사용할 수 있는 방법에 대해서도 설명합니다.
예를 들어 등록용 모델에 대해 그 위에 특성 검증을 사용합니다
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 검증입니다. 설명하지 마세요~
비고: 클라이언트 인증은 어디에서 열리고 닫나요?웹에서.config 안쪽,true or false, 네가 말하면 돼!
<appSettings> 

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

C. 백엔드 검증 완료
어떤 사람들은 컨트롤러에 전문적인Valid() 방법을 써서 검증한다고 하는데, 나는 이것이 죽음을 자초하는 리듬이 아니라고 하는데, 고기가 있는데도 두부를 먹는다고?허허, 바로 아래의 이 동동 모델 State를 말하는 거야.IsValid
[HttpPost] 

      public ActionResult Create(Register register) 

      { 

          if (ModelState.IsValid) 

          { 

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

          } 

          return View(register); 

      } 

D. 검증 기능이 너무 많아서 보고 싶은 것은 인터넷에서 찾아보거나 위에 있는 명명 공간을 역컴파일하면 볼 수 있습니다!그러나 두 가지 특성이 비교적 특수한데, 그것은 시스템이다.Web.Mvc 명칭 공간 안: Remote Attribute와Compare Attribute,Compare Attribute의 사용법은 위의 A에 이미 있다. 다음은 Remote Attribute의 예를 들어 우리가 사이트에 등록할 때 사용자 이름을 중복할 수 없도록 요구한다. 이 Remote Attribute로 실현할 수 있다. 비동기적이다.
public class Employee

{

      public int EmpId { get; set; }

      [DisplayName("Employee Name")]

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

      public String EmployeeName { get; set; }



}

그리고 네가 Action을 하나 더 쓰면 돼. 비교적 간단하기 때문에 여기는 더 이상 쓰지 않을 거야!경고: 이 Remote Attribute는 클라이언트 검증만 하고 서버에서는 검증하지 않기 때문에 어떤 사용자가 클라이언트 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.”)]

구체적인 정규 표현식은 인터넷에서 찾아보셔도 됩니다~
2. 사용자 정의 데이터 주석 특성 검증
 
이중 검증이 뭔지 먼저 말씀해 주시겠어요?
사실은 클라이언트 인증에 서버 인증만 추가된 거예요~
왜 이중 검증을 해야 합니까?
우선, 클라이언트 검증은 고객에게 직접 응답할 수 있고 서버의 압력을 줄일 수 있으며 사용자 체험도 향상시킬 수 있다. 그러나 당신은 클라이언트의 정보를 영원히 신뢰할 수 없다. (사용자는 브라우저의 스크립트 기능을 닫을 수 있어 당신의 js 검증이 철저히 작용하지 않는다) 서버 측 검증도 필수적이다.
일반적인 검증은 위에서 열거한 이 시스템들의ValidationAttribute 특성을 미리 정의해서 완성할 수 있지만, 많은 경우에 우리는 사용자 정의ValidationAttribute 특성을 만들어서 특수한 검증을 해결해야 하며, 이러한 사용자 정의 특성은 많은 곳에서 다시 사용할 수 있습니다.
네가 해야 할 일은 Validation Attribute의 방법을 다시 쓰는 것이다. Is Valid ()
밤을 들다.
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를 실현한 후에 앞의 이메일에 input 탭을 입력하기 위해 데이터-val-email 속성을 추가했을 뿐입니다. 속성 중의'이메일'은 바로ValidationType='이메일'의 이름입니다.
 
3. 자기 검증을 가진 모델
적용 장면: 검증 논리를 다시 사용할 필요가 없고 특정한 모델에 대해 검증할 뿐이다.
이러한 자체 검증 모델은 인터페이스 IValidatable Object를 실현했고 이 인터페이스는'System.ComponentModel.DataAnnotations'명칭 공간에서 정의되었다.
 
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" });

        }            

    }

}

 
4. 사용자 정의 검증의 오류 메시지
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 검증에 대해 조금밖에 모르니까 이렇게 많이 쓰세요~
 

좋은 웹페이지 즐겨찾기