我创建了一个在服务器和客户端之间共享的 ValidationAttribute。为了让验证属性在数据助手类中被引用时正确生成给客户端,我必须非常具体地说明我是如何构建它的。
我遇到的问题是,由于某种原因,当我从自定义验证属性类返回 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 时。如果我对视图模型中的值使用验证结果,那么它将正确验证。不过,我需要找到一种方法来从生成的代码中正确验证这一点。
任何想法将不胜感激。