C# 4.0 在Microsoft企业库验证框架中,我是否可以在同一个验证器属性中使用带E的多个规则集

C# 4.0 在Microsoft企业库验证框架中,我是否可以在同一个验证器属性中使用带E的多个规则集,c#-4.0,enterprise-library,C# 4.0,Enterprise Library,你好。。。。。我是Microsoft企业库验证框架的新手。我的问题是,我希望在两个不同的规则集中使用相同的验证条件。 是否可以将具有的两个规则集放在同一个验证器中,如下所示 /// <summary> /// /// </summary> [StringLengthValidator(1,25,Ruleset="DetailRuleSet",Ruleset="MainRuleSet",Tag="First Name")] public string FirstName

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

/// <summary>
/// 
/// </summary>
[StringLengthValidator(1,25,Ruleset="DetailRuleSet",Ruleset="MainRuleSet",Tag="First Name")]
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}
//
/// 
/// 
[StringLengthValidator(1,25,Ruleset=“DetailRuleSet”,Ruleset=“MainRuleSet”,Tag=“First Name”)]
公共字符串名
{
获取{return firstName;}
设置{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; }
    }
//
/// 
/// 
[StringLengthValidator(1,25,Ruleset=“DetailRuleSet”,Tag=“First Name”)]
[StringLengthValidator(1,25,Ruleset=“MainRuleSet”,Tag=“First Name”)]
公共字符串名
{
获取{return firstName;}
设置{firstName=value;}
}
任何帮助都将不胜感激

首先是免责声明:我没有在企业库应用程序验证块上做过太多工作,但是,我已经做了十五年的程序员,并且使用了从ASP.NET到MVC数据注释的验证模型,我可以告诉您,企业库中用于验证的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 */ 
    }
}
var yourModelObjectValidator=
CreateValidator(“yourRuleSetName”);
var yourModelObject=
新的YourModelClass{Foo=“Foo”,Bar=“Bar”,Gar=2};
风险值结果=
yourModelObjectValidator.Validate(yourModelObject);
如果(!results.IsValid)
{
foreach(结果中的var结果)
{ 
/*运行状态机,执行任何操作,打印*/
}
}
如果您没有像上面那样指定规则集名称,企业库将在没有名称的默认规则集的上下文中执行您的验证,因此上面使用验证属性指定的两个规则都不会执行

更新

根据你的评论,我知道你真正的问题是什么

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


答案与问题一样简单:否。因为属性
RuleSet
BaseValidationAttribute
类中声明为
string
,而不是
IEnumerable
,EntLib源代码中所有
ValidatorAttribute
类的母亲。

企业库不允许第一个类,因此如果我必须在10个规则集中放置一个验证器,那么我必须将验证器写入10次。。。。。。。。。。。。还有其他方法吗?您是否检查了此链接:@saravanan我指的是设置验证属性,而不是验证方法。我想知道有没有办法在同一个验证器中编写多个规则集(注意-:在验证器中,而不是在上面提到的验证方法中)Cooler。。。。。。。。。。。。。是的,你是对的。。。。。。。。但在我的代码上面,两个验证器都在做同样的事情。。。。。。。。为什么我要加两次。。。。。。。如果我想在20个规则集中使用相同的验证器,我必须在属性上写20次。。。。。。。我有没有办法写一次,然后把所有的规则都放进去。。。。。。。。你是对的。。。我们不能这样做,但我认为微软应该提供,否则就必须编写大量重复的代码(大量重复的属性)。你是对的。应该这样。例如,EntLib中没有表示规则集的类,因此无法从规则集遍历或导航到关联的验证器。没有人喜欢EntLib。停止使用EntLib。改用实体框架提供的数据注释。你说得对。应该这样。例如,EntLib中没有表示规则集的类,因此无法从规则集遍历或导航到关联的验证器。没有人喜欢EntLib。停止使用EntLib。改用实体框架提供的数据注释。