Silverlight 自定义ValidationAttribute的ValidationErrors未正确显示
我创建了一个ValidationAttribute,它在服务器和客户端之间共享。为了在data helper类中引用时正确地为客户机生成validation属性,我必须非常具体地说明如何构建它 我遇到的问题是,由于某种原因,当我从自定义验证属性类返回ValidationResult时,它的处理方式与客户端UI上的其他验证属性不同。它不会显示错误,而不会执行任何操作。它将正确地验证对象,只是不显示失败的验证结果 下面是我的一个自定义验证类的代码Silverlight 自定义ValidationAttribute的ValidationErrors未正确显示,silverlight,validation,binding,wcf-ria-services,validationattribute,Silverlight,Validation,Binding,Wcf Ria Services,Validationattribute,我创建了一个ValidationAttribute,它在服务器和客户端之间共享。为了在data helper类中引用时正确地为客户机生成validation属性,我必须非常具体地说明如何构建它 我遇到的问题是,由于某种原因,当我从自定义验证属性类返回ValidationResult时,它的处理方式与客户端UI上的其他验证属性不同。它不会显示错误,而不会执行任何操作。它将正确地验证对象,只是不显示失败的验证结果 下面是我的一个自定义验证类的代码 using System; using System
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}
所有这些似乎都不会使绑定的表单也验证条目。我已经尝试在绑定到文本框、XamGrids的值上使用此属性,但这两个值都没有正确验证
这个问题似乎只有在我试图在服务器端使用ValidationResult时才出现。如果我对视图模型中的值使用验证结果,那么它将正确验证。不过,我需要找到一种方法,从生成的代码中正确验证这一点
如果您有任何想法,我们将不胜感激。您需要指定与ValidationResult关联的成员名称。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}
如果显示错误,则会导致验证AnnotifyDataErrors隐式设置为trueNotifyOnValidationError将validationerror填充到其他元素,如ValidationSummary
Jeff Handly对WCF Ria服务和Silverlight中的验证有一个很好的了解,我可以推荐阅读。非常感谢。这解决了我的问题。