私は作成した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を使用しようとしている場合にのみ発生します。ビューモデルの値に対して検証結果を使用すると、正しく検証されます。私はこれを適切に生成されたコードから検証する方法を見つける必要があります。
ご意見をいただければ幸いです。
ありがとうございました。それは私の問題を解決しました。 –