您可以使用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);
}
}
显然,您可以更好地抽象它,汇总错误和警告等。
更新
我们没有与您相同的要求,但我们会做类似的事情。不幸的是,我知道执行您所说的条件验证类型的唯一方法是使用 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 等)的枚举。