我在企业验证块中有一个自定义验证. 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等).