zoukankan      html  css  js  c++  java
  • XAF实现运行时 填加验证规则并保存到数据库中

     https://www.cnblogs.com/foreachlife/p/XAFSaveValidationRuleToDB.html

    几种方法可以用来声明一个验证规则最常用的方法是使用对应的Attribute来定义。详见这里
    验证模块还允许通过业务实现 IRuleSource 接口定义自定义验证规则的来
    IRuleSource 接口公开两个成员
    名称属性返回自定义验证规则唯一名称
    CreateRules 方法实例化自定义验证规则
     
    一个场景可能需要实现自定义验证规则来执行验证规则存储数据库

    示例的 RuleRequiredFieldPersistent 一个普通业务

    实现 IRuleSource 接口

    用于创建存储数据库的 RuleRequiredField 验证规则

     CreateRules 方法实例化一个 RuleRequiredField 验证规则

    基于 RuleRequiredFieldPersistent 公共属性

    RuleRequiredFieldPersistent 标记 DefaultClassOptionsAttribute

    以便最终用户可以手动创建验证规则通过相应列表视图

    复制代码
    [DefaultClassOptions]
    public class RuleRequiredFieldPersistent : BaseObject, DevExpress.Persistent.Validation.IRuleSource 
    {
    public RuleRequiredFieldPersistent(Session session) : base(session) { } public string RuleName { get { return GetPropertyValue<string>("RuleName"); } set { SetPropertyValue("RuleName", value); } } public string CustomMessageTemplate { get { return GetPropertyValue<string>("CustomMessageTemplate"); } set { SetPropertyValue("CustomMessageTemplate", value); } } public bool SkipNullOrEmptyValues { get { return GetPropertyValue<bool>("SkipNullOrEmptyValues"); } set { SetPropertyValue("SkipNullOrEmptyValues", value); } } public string Id { get { return GetPropertyValue<string>("Id"); } set { SetPropertyValue("Id", value); } } public bool InvertResult { get { return GetPropertyValue<bool>("InvertResult"); } set { SetPropertyValue("InvertResult", value); } } public string ContextIDs { get { return GetPropertyValue<string>("ContextIDs"); } set { SetPropertyValue("ContextIDs", value); } } public string Property { get { return GetPropertyValue<string>("Property"); } set { SetPropertyValue("Property", value); } } [Persistent("ObjectType")] protected string ObjectType { get { if(ObjectTypeCore != null) { return ObjectTypeCore.FullName; } return ""; } set { ObjectTypeCore = ReflectionHelper.FindType(value); } } [NonPersistent] [TypeConverter(typeof(DevExpress.Persistent.Base.LocalizedClassInfoTypeConverter))] public Type ObjectTypeCore { get { return GetPropertyValue<Type>("ObjectTypeCore"); } set { SetPropertyValue("ObjectTypeCore", value); } } #region IRuleSource Members public System.Collections.Generic.ICollection<IRule> CreateRules() { System.Collections.Generic.List<IRule> list = new System.Collections.Generic.List<IRule>(); RuleRequiredField rule = new RuleRequiredField(); rule.Properties.SkipNullOrEmptyValues = this.SkipNullOrEmptyValues; rule.Properties.Id = this.Id; rule.Properties.InvertResult = this.InvertResult; rule.Properties.CustomMessageTemplate = this.CustomMessageTemplate; rule.Properties.TargetContextIDs = new ContextIdentifiers(this.ContextIDs); rule.Properties.TargetType = this.ObjectTypeCore; if(rule.Properties.TargetType != null) { foreach(PropertyInfo pi in rule.Properties.TargetType.GetProperties()) { if(pi.Name == this.Property) { rule.Properties.TargetPropertyName = pi.Name; } } } for(int i = Validator.RuleSet.RegisteredRules.Count - 1; i >= 0; i--) { if(Validator.RuleSet.RegisteredRules[i].Id == this.Id) { Validator.RuleSet.RegisteredRules.RemoveAt(i); } } list.Add(rule); return list; } [Browsable(false)] public string Name { get { return this.RuleName; } } #endregion }
    复制代码

    可以看到,这个示例中,只返回了一个规则,而在实际项目中,可以使用BO定义一个子集合,集合中定义N种规则。

    不要定义N个BO并都实现 IRuleSource 那样有点浪费。


     
  • 相关阅读:
    JDOJ 2430: 组合数取模
    USACO Dual Palindromes
    洛谷 P1365 WJMZBMR打osu! / Easy
    洛谷 P6154 游走
    洛谷 P1654 OSU!
    洛谷 P3802 小魔女帕琪
    洛谷 P1784 数独
    POJ King Arthur's Birthday Celebration
    洛谷 P4550 收集邮票
    洛谷 SP1026 FAVDICE
  • 原文地址:https://www.cnblogs.com/xyyhcn/p/11726469.html
Copyright © 2011-2022 走看看