5

Ho un ValidationAttribute che ho creato e che è condiviso tra Server e Client. Per ottenere l'attributo di validazione da generare correttamente al client quando si fa riferimento a una classe helper di dati, dovevo essere molto specifico nel modo in cui l'ho creato.ValidationErrors of custom ValidationAttribute non visualizzato in modo corretto

Il problema che sto avendo è che per qualche motivo quando restituisco un ValidationResult dalla mia classe di attributo di convalida personalizzata non è gestito allo stesso modo di altri attributi di convalida sull'interfaccia utente del client. Invece di mostrare l'errore, non fa nulla. Tuttavia, convaliderà correttamente l'oggetto, ma non mostrerà il risultato della convalida non riuscita.

Di seguito è riportato il codice per una delle mie classi di convalida personalizzate.

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

Ecco come lo uso sopra le mie Proprietà sia sul server che sul client.

[DisallowedChars(DisallowedCharacters = "=")] 

E ho provato diversi modi di impostare l'associazione.

{Binding Value, NotifyOnValidationError=True} 

Così come

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

Nessuno di questi sembra fare le forme che sono soggetti anche convalidare le voci. Ho provato a utilizzare questo attributo su valori associati a TextBoxes, XamGrids e nessuno di quelli correttamente convalidati come dovrebbero.

Questo problema sembra essere solo quando sto tentando di utilizzare ValidationResult sul lato server. Se utilizzo il risultato della convalida su un valore nel mio modello di vista, verrà validato correttamente. Ho bisogno di trovare un modo per farlo correttamente convalidare dal codice generato però.

Ogni pensiero sarebbe molto apprezzato.

risposta

4

È necessario specificare i MemberNames associati a ValidationResult. Il costruttore di ValidationResult ha un parametro aggiuntivo per specificare le proprietà associate al risultato. Se non si specifica alcuna proprietà, il risultato viene gestito come errore di convalida a livello di entità.

Quindi nel tuo caso, dovrebbe essere corretto, quando si passa il nome della proprietà al costruttore del 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; 
} 

Per gli attacchi non è necessario specificare altro. Così la semplice rilegatura

{Binding Value} 

dovrebbe visualizzare errori, causano ValidatesOnNotifyDataErrors è impostata su true in modo implicito. NotifyOnValidationError popola ValidationErrors su altri elementi come ValidationSummary.

Jeff Handly ha davvero un goog blog post sulla convalida nei servizi Ria WCF e Silverlight, posso recommened leggere.

+0

Grazie mille. Questo ha risolto il mio problema. –