有 几种 方法 可以 用来 声明 一个 验证 规则 。 最常用的方法是使用对应的Attribute来定义。详见这里。 验证 模块还 允许 您 通过 在 业务 类 实现 IRuleSource 接口 定义 自定义 的 验证 规则的来 源 。 IRuleSource 接口 公开 两个 成员 。 名称 属性 应

几种方法可以用来声明一个验证规则最常用的方法是使用对应的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("ObjectTypeCore"); }
        set { SetPropertyValue("ObjectTypeCore", value); }
    }
    #region IRuleSource Members
    public System.Collections.Generic.ICollection CreateRules() {
        System.Collections.Generic.List list = new System.Collections.Generic.List();
        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 那样有点浪费。


09-10 10:24