Ben*_*rby 5 validation silverlight binding wcf-ria-services validationattribute
我有一个我创建的ValidationAttribute,它在Server和Client之间共享.为了在数据助手类中引用时将验证属性正确生成到客户端,我必须非常具体地构建它.
我遇到的问题是,由于某种原因,当我从自定义验证属性类返回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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我在服务器和客户端上的属性上面使用它的方法.
[DisallowedChars(DisallowedCharacters = "=")]
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种不同的方法来设置绑定.
{Binding Value, NotifyOnValidationError=True}
Run Code Online (Sandbox Code Playgroud)
以及
{Binding Value, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, ValidatesOnNotifyDataErrors=True}
Run Code Online (Sandbox Code Playgroud)
这些似乎都不会使他们绑定的表单也验证条目.我已经尝试在绑定到TextBoxes,XamGrids的值上使用此属性,并且这两个值都没有像他们那样正确验证.
这个问题似乎只是在我尝试在服务器端使用ValidationResult时.如果我对视图模型中的值使用验证结果,那么它将正确验证.我需要找到一种方法来从生成的代码中正确验证.
任何想法都会非常感激.
您需要指定与 ValidationResult 关联的 MemberName。ValidationResult 的构造函数有一个附加参数来指定与结果关联的属性。如果不指定任何属性,结果将作为实体级别的验证错误进行处理。
\n\n因此,在您的情况下,当您将属性名称传递给 ValidationResult 的构造函数时,应该修复它。
\n\nprotected override ValidationResult IsValid(object value, ValidationContext validationContext) {\n if (value != null && this.disallowedCharacters.Count() > 0) {\n string Value = value.ToString();\n\n foreach(char val in this.disallowedCharacters) {\n if ((!this.CaseSensitive && Value.ToLower().Contains(val)) || Value.Contains(val)) {\n //return new ValidationResult(string.Format(this.ErrorMessage != null ? this.ErrorMessage : "\'{0}\' is not allowed an allowed character.", val.ToString()));\n string errorMessage = string.Format(this.ErrorMessage != null ? this.ErrorMessage : "\'{0}\' is not allowed an allowed character.", val.ToString());\n return new ValidationResult(errorMessage, new string[] { validationContext.MemberName});\n }\n }\n }\n\n return ValidationResult.Success;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n对于绑定,您不需要指定任何其他内容。所以简单的绑定
\n\n{Binding Value}\nRun Code Online (Sandbox Code Playgroud)\n\n应显示错误,因为ValidatesOnNotifyDataErrors隐式设置为 true。NotifyOnValidationError将 ValidationError 填充到其他元素(例如 ValidationSummary)。
\n\nJeff Handly 有一篇关于 WCF Ria 服务和 Silverlight 中的验证的非常好的博客文章,我可以推荐阅读。
\n