编程语言
首页 > 编程语言> > C#-自定义验证器并指定消息类型

C#-自定义验证器并指定消息类型

作者:互联网

我在企业验证块中有一个自定义验证. DoValidate方法如下所示.

protected override void DoValidate(Double objectToValidate, 
    object currentTarget, string key, ValidationResults validationResults)
{
    if (!IsSalMoreThanMinWage(objectToValidate))
    {
        //Here I need to mark this message as a "Warning"
        LogValidationResult(validationResults, 
            "Salary is too low for this state", currentTarget, key);
    }
}

我需要将此验证失败标记为“警告”消息.在前端,当我遍历ValidationResults集合并获取ValidationResult对象时,我将需要标识和分组不同类型的消息并以不同的方式呈现它们.

我的问题是-如何将失败标记为警告?

解决方法:

您可以使用ValidationResult的Tag属性. “The meaning for a tag is determined by the client code consuming the ValidationResults.”

如果使用配置,则可以在配置文件中指定标签:

<validator lowerBound="0" lowerBoundType="Inclusive" 
upperBound="255" upperBoundType="Inclusive" negated="false" messageTemplateResourceName="" messageTemplateResourceType="" 
messageTemplate="Oops a warning occurred" 
tag="Warning" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
name="My Validator" />

或使用属性设置标签:

[StringLengthValidator(5, 50, Ruleset = "RuleSetA", Tag="Warning")]

如果要以编程方式执行此操作,则由于Tag属性为只读,因此必须创建一个新的验证结果:

ValidationResults newResults = new ValidationResults();

foreach (ValidationResult vr in validationResults)
{
    newResults.AddResult( new ValidationResult( 
        vr.Message, vr.Target, vr.Key, "Warning", vr.Validator, vr.NestedValidationResults ) );
}

然后,可以在前端检查ValidationResult的Tag属性以查看是否为警告:

foreach (ValidationResult vr in validationResults)
{
    if (string.Compare(vr.Tag, "Warning") == 0)
    {
        DisplayWarning(vr.Message);
    }
    else
    {
        DisplayError(vr.Message);
    }
}

显然,您可以更好地对此进行抽象,汇总错误和警告等.

更新

我们没有与您相同的要求,但我们做了类似的事情.不幸的是,我知道执行您所讨论的条件验证类型的唯一方法是使用RuleSets.

我们要做的是为RuleSet使用命名约定,并在运行时构造RuleSet名称.如果RuleSet存在,则我们运行验证器.您可以为警告做类似的事情.因此,您可以拥有两个规则集:

> RuleSet_Salary_Update
> RuleSet_Salary_Update_Warning

然后根据是否要运行警告验证来检索验证者列表:

public static List<Validator<T>> CreateValidators<T>(bool shoulIncludeWarning, RuleSetType rulesetType)
{
     if (shouldIncludeWarning)
     {
         // Get warning validator if any
     }

     // Get Default validator (if any)
}

RuleSetType是具有不同类型规则的枚举(例如,Select,Insert,Update,Delete,PrimaryKey等).

标签:validation,enterprise-library,c,net
来源: https://codeday.me/bug/20191210/2099707.html