5

서버와 클라이언트간에 공유되는 ValidationAttribute가 있습니다. 데이터 도우미 클래스 내에서 참조 될 때 클라이언트에 제대로 생성되도록 유효성 검사 속성을 얻으려면 필자가 작성한 방법에 매우 구체적이어야했습니다.ValidationArribute가 올바르게 표시되지 않았습니다.

내가 가지고있는 문제는 사용자 지정 유효성 검사 특성 클래스에서 ValidationResult를 반환 할 때 어떤 이유로 클라이언트 UI의 다른 유효성 검사 특성과 동일하게 처리되지 않는다는 것입니다. 오류를 표시하는 대신 아무 것도하지 않습니다. 객체의 유효성을 올바르게 검사하지만 실패한 유효성 검사 결과는 표시하지 않습니다.

다음은 사용자 정의 유효성 검사 클래스 중 하나의 코드입니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel.DataAnnotations; 

namespace Project.Web.DataLayer.ValidationAttributes 
{ 
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
    public class DisallowedChars : ValidationAttribute 
    { 
     public string DisallowedCharacters 
     { 
      get 
      { 
       return new string(this.disallowedCharacters); 
      } 

      set 
      { 
       this.disallowedCharacters = (!this.CaseSensitive ?  value.ToLower().ToCharArray() : value.ToCharArray()); 
      } 
     } 

     private char[] disallowedCharacters = null; 

     private bool caseSensitive; 

     public bool CaseSensitive 
     { 
      get 
      { 
       return this.caseSensitive; 
      } 

      set 
      { 
       this.caseSensitive = value; 
      } 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (value != null && this.disallowedCharacters.Count() > 0) 
      { 
       string Value = value.ToString(); 

       foreach(char val in this.disallowedCharacters) 
       { 
        if ((!this.CaseSensitive && Value.ToLower().Contains(val)) ||  Value.Contains(val)) 
        { 
         return new ValidationResult(string.Format(this.ErrorMessage != null ? this.ErrorMessage : "'{0}' is not allowed an allowed character.", val.ToString())); 
        } 
       } 
      } 

      return ValidationResult.Success; 
     } 
    } 
} 

이렇게하면 서버와 클라이언트 모두에서 내 속성보다 위에 사용하는 방법입니다.

[DisallowedChars(DisallowedCharacters = "=")] 

그리고 바인딩을 설정하는 여러 가지 방법을 시도했습니다. 이들의

{Binding Value, NotifyOnValidationError=True} 

뿐만 아니라

{Binding Value, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, ValidatesOnNotifyDataErrors=True} 

아무도 그들도 항목을 확인 바인딩 된 폼을 만들기 위해 보이지 않는다. TextBoxes, XamGrids에 바인딩 된 값에이 특성을 사용하려고 시도했지만 어느 쪽도 올바르게 유효성을 검사하지 못했습니다.

이 문제는 서버 측에서 ValidationResult를 사용하려고 할 때만 나타나는 것으로 보입니다. 내 뷰 모델의 값에 대한 유효성 검사 결과를 사용하면 유효성을 올바르게 검사합니다. 그래도 제대로 생성 된 코드에서 유효성을 검사 할 수있는 방법을 찾아야합니다.

어떤 생각이라도 대단히 감사하겠습니다.

답변

4

ValidationResult와 연결된 MemberNames를 지정해야합니다. ValidationResult의 생성자에는 결과와 관련된 속성을 지정하는 추가 매개 변수가 있습니다. 특성을 지정하지 않으면 결과는 엔티티 레벨의 유효성 검증 오류로 처리됩니다.

따라서 ValidationResult 생성자에 속성 이름을 전달할 때 수정해야합니다.

protected override ValidationResult IsValid(object value, ValidationContext validationContext) { 
if (value != null && this.disallowedCharacters.Count() > 0) { 
    string Value = value.ToString(); 

    foreach(char val in this.disallowedCharacters) { 
    if ((!this.CaseSensitive && Value.ToLower().Contains(val)) || Value.Contains(val)) { 
     //return new ValidationResult(string.Format(this.ErrorMessage != null ? this.ErrorMessage : "'{0}' is not allowed an allowed character.", val.ToString())); 
     string errorMessage = string.Format(this.ErrorMessage != null ? this.ErrorMessage : "'{0}' is not allowed an allowed character.", val.ToString()); 
     return new ValidationResult(errorMessage, new string[] { validationContext.MemberName}); 
    } 
    } 
} 

return ValidationResult.Success; 
} 

바인딩의 경우 다른 사항을 지정하지 않아도됩니다. 그래서, 오류를 표시해야

{Binding Value} 

바인딩 단순 암시 적으로 true로 설정되어 ValidatesOnNotifyDataErrors 원인이됩니다. NotifyOnValidationError은 ValidationErrors를 ValidationSummary와 같은 다른 요소로 채 웁니다.

제프 핸리 (Jeff Handly)는 WCF Ria Services 및 Silverlight에서 유효성 검사에 대해 실제적으로 goog blog post을 가지고 있습니다.

+0

대단히 감사합니다. 그건 내 문제를 해결. –

관련 문제