5

Sunucu ile İstemci arasında paylaşılan bir ValidationAttribute var. Doğrulama özniteliğinin bir veri yardımcı sınıfında başvurulan istemciye düzgün bir şekilde üretilmesini sağlamak için, onu nasıl oluşturduğum konusunda çok spesifik olmalıydım.ValidationEtrores özel ValidationAttribute düzgün görüntülenmiyor

Yapmakta olduğum sorun, bir nedenle, özel doğrulama özniteliği sınıfımdan bir ValidationResult döndürdüğümde, istemci UI'sindeki diğer doğrulama öznitelikleriyle aynı şekilde ele alınmamasıdır. Hatayı görüntülemek yerine hiçbir şey yapmaz. Nesneyi doğru şekilde doğrulayacak olsa da, yalnızca başarısız doğrulama sonucunu göstermiyor.

Özel doğrulama sınıflarımdan birinin kodu aşağıdadır.

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

Özelliklerimi hem sunucum hem de istemcide bu şekilde kullanırım.

[DisallowedChars(DisallowedCharacters = "=")] 

Ve bağlamayı ayarlamak için birkaç farklı yöntem denedim. Bunlardan

{Binding Value, NotifyOnValidationError=True} 

yanı sıra

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

Yok onlar da girişlerini doğrulamak bağlı formları yapmak gibi görünüyor. Bu özniteliği, TextBoxes, XamGrids'e bağlı olan değerlerde kullanmayı denedim ve bunların gerektiği gibi doğrulayamadıklarını.

Bu sorun, yalnızca sunucu tarafında ValidationResult'u kullanmaya çalıştığımda görünüyor. Doğrulama sonucumu, görünüm modelimde bir değerde kullanırsam, doğru bir şekilde doğrular. Bununla birlikte, üretilen kodu doğru şekilde doğrulamak için bir yol bulmam gerekiyor.

Herhangi bir düşünce çok takdir edilecektir.

cevap

4

ValidationResult ile ilişkili Üye Adlarını belirtmeniz gerekir. ValidationResult yapıcısı, sonuçla ilişkili özellikleri belirtmek için ek bir parametreye sahiptir. Herhangi bir özellik belirtmezseniz, sonuç varlık düzeyinde bir doğrulama hatası olarak ele alınır.

Durumunuzda, ValidationResult öğesinin yapıcısına mülkün adını ilettiğinizde düzeltilmesi gerekir.

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

Bağlantılar için başka bir şey belirtmeniz gerekmez. Yani, hataları göstermesi gerekir

{Binding Value} 

Bağlama basit dolaylı true olarak ayarlanır ValidatesOnNotifyDataErrors neden olur. NotifyOnValidationError, ValidationErrors öğesini ValidationSummary gibi diğer öğelere de yerleştirir.

Jeff Handly, WCF Ria Services ve Silverlight'ta Doğrulama hakkında blog post gerçekten bir goog'a sahiptir, okumanızı önerebilirim.

+0

Çok teşekkür ederim. Bu benim problemimi çözdü. –