XAF实现运行时填加验证规则并保存到数据库中

有几种方法可以用来声明一个验证规则。最常用的方法是使用对应的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 那样有点浪费。

时间: 2024-10-10 09:36:08

XAF实现运行时填加验证规则并保存到数据库中的相关文章

yii 使用cactiveform 创建表单时候遇到的一些验证问题和使用ajax_form时重置验证规则的解决办法

yii  cactiveform 在添加验证信息的时候, 有时候稍有不慎,可能导致客户端验证不起作用,尤其是像我这种初学者来说,更是无解了, 好在今天有点时间, 一路追查这个问题,最后从js 端一直追到了php中, 终于找到了罪魁祸首,原来还是我们自己,哈哈  接下来就简单分享一下: 首先让我们来看看所有的客户端js验证是怎么添加上去的: 在CActiveForm.php :383行 中有这么一句话: $options=CJavaScript::encode($options); $cs->re

利用.NET Code Contracts实现运行时验证

.NET的Contract类库是Declarative Programming实践的一部分,可以对日常编程带来很多好处: 提高代码可读性,使用者一看Require, Ensure就知道这方法接受什么输入,产生什么输出. 减少重复的验证代码 配合第三方工具,可以方便静态代码分析和单元测试,方便产生API文档,这些功能可以参见Code Contract主页 Contract类本身已经在.NET 4.0之后集成进了System.Diagnostics.Contracts命名空间,但如果想使用Contr

[Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据 [Asp.net MVC]Asp.net MVC5系列——添加数据 概述 上篇文章中介绍了添加数据,在提交表单的数据的时候,我们需

[精通Objective-C]运行时系统

[精通Objective-C]运行时系统 参考书籍:<精通Objective-C>[美] Keith Lee 目录 精通Objective-C运行时系统 目录 运行时系统概述 对象消息 选择器 方法签名 使用对象消息 动态类型 动态绑定 动态方法决议 动态加载 内省 运行时系统的组成部分 编译器 运行时系统库 元类 与运行时系统交互 运行时系统概述 Objective-C拥有相当多的动态特性,这些特性在运行程序时发挥作用,而不是在编译或链接代码时发挥作用.Objective-C运行时系统实现了

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄.性别.专业技能等方面有不同的要求.但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上.这样的验证

开发函数计算的正确姿势———为 PHP 运行时添加自定义扩展

PHP 语言提供了一种扩展机制(Extension),通过 PHP 扩展可以增强语法.调用 C/C++ 实现的库函数以及优化执行性能.PHP 扩展是与平台相关的动态链接库,在 Linux 和 Mac 平台是 .so 文件,在 Windows 平台是 .dll 文件.由于函数计算的开发通常在 Mac 和 Windows 平台,而运行时是 Linux(Debain)环境,所以为函数计算 PHP 运行时添加扩展会遇到由于动态链接库平台相关而导致要么本地无法调试,要么远端无法运行的问题.本文介绍借助 F

处理Android程序运行时的配置变化

本篇文章翻译自Android官方文档Handling Runtime Changes,有翻译错误请留言告知,多谢. Android程序在运行期间设备的配置是可能发生改变的(例如屏幕的方向,键盘可用性,和语言等).当这些配置发生变化时,Android会重启正在运行的Activity(先调用onDestory(),紧接着调用onCreate()).这个设计是为了让你的程序在配置发生变化时,使用不同的资源自动去适配新的配置机器. 正确的处理重启,一件很重要的事就是通过Activity正常的生命周期去恢

iOS开发-方法调用在运行时的过程

方法调用在运行时的过程 如果用实例对象调用实例方法,会到实例的isa指针指向的对象(也就是类对象)操作. 如果调用的是类方法,就会到类对象的isa指针指向的对象(也就是元类对象)中操作. 首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现并执行. 如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应实现执行 如果没找到,去父类指针所指向的对象中执行1,2. 以此类推,如果一直到根类还没找到,转向拦截调用. 如果没有重写拦截调用的方法,程序报错. 以

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr