0

你好.....我是微软企业库验证框架的新手。我的问题是我想在两个不同的 RuleSet 中使用相同的验证条件。是否可以将两个规则集放在同一个验证器中,如下所示

/// <summary>
/// 
/// </summary>
[StringLengthValidator(1,25,Ruleset="DetailRuleSet",Ruleset="MainRuleSet",Tag="First Name")]
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}

或者我已经通过两次使用不同的规则集名称编写相同的内容来提到它,如下所示

    /// <summary>
    /// 
    /// </summary>
    [StringLengthValidator(1,25,Ruleset="DetailRuleSet",Tag="First Name")]
    [StringLengthValidator(1, 25, Ruleset = "MainRuleSet", Tag = "First Name")]
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

任何帮助,将不胜感激!!

4

1 回答 1

0

首先是免责声明:我在企业库应用程序验证块上工作得不多,但是,我已经做了十多年的程序员,并且使用过从 ASP.NET 到 MVC 数据注释的验证模型,我可以告诉您认为 Enterprise Library 中用于验证的 API 非常相似。我花了大约 20 分钟来下载企业库源代码并查找此问题的答案。所以,这是我的答案。

是的,您可以将多个验证属性应用于给定模型属性,每个验证属性指定不同的规则集。

但是,在这种情况下,您必须针对该特定规则集显式调用模型类型的验证器。

如果您不这样做,企业库将为默认规则集执行验证器。

在您的示例的上下文中,您可以说:

StringLengthValidator(1,25,Ruleset="DetailRuleSet",Tag="First Name")]
    [StringLengthValidator(1, 25, Ruleset = "MainRuleSet", Tag = "First Name")]
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

但是,在这种情况下,您必须专门调用其中一个规则集进行验证,如下所示:

var yourModelObjectValidator = 
    yourValidatorFactory.CreateValidator<YourModelClass>("yourRuleSetName");

var yourModelObject = 
    new YourModelClass { Foo = "foo", Bar = "bar", Gar = 2 };

var results = 
    yourModelObjectValidator.Validate(yourModelObject);

if (!results.IsValid)
{
   foreach(var result in results) 
    { 
        /* run the state machine, do whatever, print */ 
    }
}

如果您没有像我们上面那样指定规则集名称,企业​​库将在没有名称的默认规则集的上下文中执行您的验证,因此您上面使用验证属性指定的两个规则都不会得到执行。

更新

根据您的评论,我明白您的真正问题是什么。

那么您的问题实际上是:我可以在单个验证属性声明中指定多个规则集吗?

答案就像问题一样简单:不。因为属性RuleSet被简单地声明为string而不是IEnumerable<string>在类中,它是 EntLib 源代码BaseValidationAttribute中所有类的母亲。ValidatorAttribute

于 2013-05-20T18:24:32.120 回答