您可以使用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);
}
}
很明顯,你可以抽象不過如此,聚集的錯誤和警告等
UPDATE
我們對您的要求並不完全相同,但我們的工作類似。不幸的是,我知道執行您所談論的條件驗證的唯一方式就是使用RuleSets。
我們所做的是對RuleSets使用命名約定,並在運行時構造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等)。
@Tuzo - 是的,這是我最終做的。我本來希望VAB製造商使用不同的數據類型作爲標籤。我想使用枚舉,但最終不得不做一些將字符串標籤轉換爲枚舉的骯髒工作。 就像史蒂文指出的那樣,一旦用戶壓制警告,我需要一種方法來再次運行驗證,但現在忽略警告。我想在不使用規則集的情況下這樣做(除非有一種爲單個驗證程序指定多個規則集的方法) – Nick 2010-03-30 13:38:43
@Tuzo - 關於您的更新 - 您說「爲規則集使用命名約定並在運行時構建它們」 你是否在運行時命名規則集? – Nick 2010-03-30 18:02:19
對不起,我很清楚,我正在討論在運行時使用命名約定來構造RuleSet **名稱**。不自動創建RuleSets。 – 2010-03-30 18:31:03