我可以在Microsoft企业库验证框架中的同一验证属性中使用多个RuleSet

时间:2013-05-19 04:00:35

标签: c#-4.0 enterprise-library

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

/// <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; }
    }

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

1 个答案:

答案 0 :(得分:0)

首先是免责声明:我在企业库应用程序验证块上没有那么多工作,但是,作为程序员已经超过十五年了,并且使用了ASP.NET的验证模型对于MVC Data Annotations,我可以告诉你,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>而不是BaseValidationAttribute EntLib源代码中的所有ValidatorAttribute类。