5

Tôi có một ValidationAttribute mà tôi đã tạo được chia sẻ giữa Server và Client. Để có được thuộc tính xác nhận hợp lệ để tạo ra cho máy khách khi được tham chiếu trong lớp trợ giúp dữ liệu, tôi phải rất cụ thể trong cách tôi đã xây dựng nó.ValidationErrors của ValidationAttribute tùy chỉnh không được hiển thị đúng cách

Sự cố tôi gặp phải là vì một lý do nào đó khi tôi trả về ValidationResult từ lớp thuộc tính xác thực tùy chỉnh, nó không được xử lý giống như các thuộc tính xác thực khác trên giao diện người dùng. Thay vì hiển thị lỗi, nó không làm gì cả. Nó sẽ xác nhận hợp lệ đối tượng mặc dù, nó chỉ không hiển thị kết quả xác nhận không thành công.

Dưới đây là mã cho một trong các lớp xác thực tùy chỉnh của tôi.

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; 
     } 
    } 
} 

Đây là cách tôi sử dụng nó trên Thuộc tính của tôi trên cả máy chủ và ứng dụng khách.

[DisallowedChars(DisallowedCharacters = "=")] 

Và tôi đã thử một số cách khác nhau để thiết lập ràng buộc.

{Binding Value, NotifyOnValidationError=True} 

Cũng như

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

Không ai trong số những vẻ để làm cho hình thức mà họ đang bị ràng buộc quá xác nhận các mục. Tôi đã thử bằng cách sử dụng thuộc tính này trên các giá trị được ràng buộc với TextBoxes, XamGrids, và không phải của những người hợp lệ xác nhận như họ nên.

Vấn đề này chỉ có vẻ là khi tôi đang cố gắng sử dụng ValidationResult ở phía máy chủ. Nếu tôi sử dụng kết quả xác nhận trên một giá trị trong mô hình khung nhìn của tôi thì nó sẽ xác nhận hợp lệ. Tôi cần phải tìm một cách để làm cho xác nhận hợp lệ này từ mã được tạo ra mặc dù.

Bất kỳ suy nghĩ nào cũng sẽ được đánh giá rất nhiều.

Trả lời

4

Bạn cần chỉ định MemberNames được liên kết với ValidationResult. Hàm tạo của ValidationResult có một tham số bổ sung để xác định các thuộc tính được liên kết với kết quả. Nếu bạn không chỉ định bất kỳ thuộc tính nào, kết quả sẽ được xử lý dưới dạng lỗi xác thực trên cấp thực thể.

Vì vậy, trong trường hợp của bạn, cần phải khắc phục khi bạn chuyển tên của thuộc tính cho hàm tạo của 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; 
} 

Đối với các ràng buộc, bạn không cần phải chỉ định bất kỳ điều gì khác. Vì vậy, đơn giản Binding

{Binding Value} 

sẽ hiển thị lỗi, gây ValidatesOnNotifyDataErrors được thiết lập là true ngầm. NotifyOnValidationError populates ValidationErrors thành các phần tử khác như ValidationSummary.

Jeff Handly có một goog thực sự blog post về Xác thực trong các dịch vụ của WCF Ria và Silverlight, tôi có thể được giới thiệu để đọc.

+0

Cảm ơn bạn rất nhiều. Điều đó đã khắc phục được vấn đề của tôi. –

Các vấn đề liên quan