5

私は作成したValidationAttributeをサーバーとクライアントの間で共有しています。データヘルパークラス内で参照されたときに検証属性を適切にクライアントに生成させるために、私はそれをどのように構築したかを非常に具体的に説明しなければなりませんでした。カスタムValidationAttributeのValidationErrorsが正しく表示されない

私が抱えている問題は、カスタム検証属性クラスから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は、ValidationSummaryのような他の要素にValidationErrorsを設定します。

Jeff HandlyはWCF Ria ServicesとSilverlightの検証について実際にgoog blog postを持っています。私は読むことをお勧めします。

+0

ありがとうございました。それは私の問題を解決しました。 –