ASP.NET MVC의 검증 끝판왕 편
29103 단어 asp.net
본론으로 돌아가면 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 검증에 대해 조금밖에 모르니까 이렇게 많이 쓰세요~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.