【问题标题】:Throw localized ValidationException抛出本地化的 ValidationException
【发布时间】:2012-05-30 01:11:10
【问题描述】:

我正在创建一个自定义属性验证,它应该在抛出 ValidationException 时使用指定资源文件中的错误字符串。我是否假设如果我抛出异常并且没有在参数中指定错误字符串,它应该使用我在构造函数中指定的 ErrorMessageResourceName 和 ErrorMessageResourceType?

using System;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

namespace OurProduct.Util
{
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public class UniquenessAttribute : ValidationAttribute
    {
        public UniquenessAttribute()
        {
            ErrorMessageResourceName = "EmailUniqueError";
            ErrorMessageResourceType = typeof (Resources.OurThing);
        }

        protected override ValidationResult IsValid(object value)
        {
            throw new ValidationException();
        }
    }
}

【问题讨论】:

  • 是的,我知道在这个例子中不可能返回 ValidationResult.Success ,但我知道这是可行的 ;)
  • 它应该可以工作,只要 OurThing 指向生成的强类型资源类,用于查找本地化字符串等,并且“EmailUniqueError”是该类的静态属性之一。还要确保在进行测试时验证所有属性(例如,如果使用 TryValidateObject,请确保最后一个参数设置为 true)。但是不要扔,只要返回 false 给 IsValid()
  • @SimonMourier 你能详细说明你的最后一句话吗?我之所以使用需要 ValidationResult 的 IsValid 版本,是因为我需要查找父对象的其他成员的值,以调用服务。问题在于尝试在正常工作时返回 ValidationResult.Success,但在不正常时返回正确本地化的 ErrorMessage。
  • 好的,那么你应该返回如下内容:return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));,以防出错。
  • 你太棒了,西蒙。请将此作为答案,以便我接受。

标签: c# validation


【解决方案1】:

如果OurThing 指向生成的强类型资源类,用于查找本地化字符串等,以下应该可以工作,并且"EmailUniqueError" 是该类的静态属性之一:

    public class UniquenessAttribute : ValidationAttribute
    {
        public UniquenessAttribute()
        {
            ErrorMessageResourceName = "EmailUniqueError";
            ErrorMessageResourceType = typeof (Resources.OurThing);
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (failure) // to implement
                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            ...
        }
    }

同时确保在进行测试时验证所有属性(例如,如果您使用 TryValidateObject,请确保最后一个参数设置为 true)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2017-11-06
    相关资源
    最近更新 更多