C# 4.0 在Microsoft企业库验证框架中,我是否可以在同一个验证器属性中使用带E的多个规则集
你好。。。。。我是Microsoft企业库验证框架的新手。我的问题是,我希望在两个不同的规则集中使用相同的验证条件。 是否可以将具有的两个规则集放在同一个验证器中,如下所示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
/// <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。改用实体框架提供的数据注释。