silverlight - 自定义 ValidationAttribute 的 ValidationErrors 未正确显示

标签 silverlight validation binding wcf-ria-services validationattribute

我创建了一个在服务器和客户端之间共享的 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 = "=")]

而且我尝试了几种不同的方法来设置绑定(bind)。
{Binding Value, NotifyOnValidationError=True}


{Binding Value, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, ValidatesOnNotifyDataErrors=True}

这些似乎都没有使它们绑定(bind)的表单也验证条目。我已经尝试在绑定(bind)到 TextBoxes、XamGrids 的值上使用此属性,并且这些值都没有像应有的那样正确验证。

这个问题似乎只出现在我尝试在服务器端使用 ValidationResult 时。如果我对 View 模型中的值使用验证结果,那么它将正确验证。不过,我需要找到一种方法来从生成的代码中正确验证这一点。

任何想法将不胜感激。

最佳答案

您需要指定与 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;
}

对于绑定(bind),您不需要指定任何其他内容。所以简单的绑定(bind)
{Binding Value}

应该显示错误,导致 ValidatesOnNotifyDataErrors 隐式设置为 true。 NotifyOnValidationError 将 ValidationErrors 填充到其他元素,如 ValidationSummary。

杰夫·汉德利 (Jeff Handly) 非常喜欢 blog post关于 WCF Ria 服务和 Silverlight 中的验证,我可以推荐阅读。

关于silverlight - 自定义 ValidationAttribute 的 ValidationErrors 未正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159655/

相关文章:

C# - 在绑定(bind)中从 System.String 转换为 System.Nullable<Sytem.Int32> 时出现问题

c# - 以编程方式在 IIS 中注册 Silverlight MIME 类型

javascript - 阻止输入英语以外的任何其他字母

forms - maxlength 属性的 Angular 验证消息

javascript - 即使超过 ng-maxlength,如何显示文本长度?

WPF 绑定(bind)到另一个元素的 ViewModel

silverlight - 更改 windows phone 7 silverlight 项目命名空间导致启动失败

c# - 向 Silverlight 客户端公开数据库索引是否安全?

silverlight - 如何对两个 UI 元素进行数据绑定(bind),以便它们可以在 Silverlight 中立即相互更新?

wpf - 在 TargetUpdated 事件上对 DataGrid 单元格背景进行动画处理