2012-02-19 3 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. ,342,276,261,594,258,973,210

  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이 있습니다.

클라이언트 측 유효성 검사가 필수 항목과 같은 간단한 규칙으로 잘 작동하는 것을 볼 수 있듯이 몇 가지 실제 유효성 검사를 시작하면 직접 구현해야합니다.

+0

감사합니다. 그래서 그것은 정말로 건조하지 않은가? :-) 사용자 정의 유효성 검사 인 경우이를 반복해야합니다. – Lijo

+1

@Lijo, 예, DRY가 아닙니다. 그러나 그것이 그 방법입니다. 클라이언트에서 이러한 맞춤 규칙을 구현하는 것이 왜 효과가 있습니까? 물론 절대적으로 필요하다면 자바 스크립트 작성을 준비하십시오. –

+0

감사합니다. 한 가지 더 묻습니다. 자체 유효성 검사 접근법을 사용하고 있다면 클라이언트 스크립트를 작성할 수 있습니까? – Lijo