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

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

  1. XAF:如何让用户在运行时个性化界面并将个性化信息保存到数据库中 win/web/entityframework/xpo

    本主题介绍如何启用管理模型差异(XAFML),并将设置存储在数据库中.   名词解释: 1.模型:XAF中把所有应用程序的结构都用模型来定义,比如列表,有哪些列,名称是什么,对应的字段名是什么,业务对 ...

  2. 使用jpa时,实体类有不存在数据库中的字段

    使用jpa时,实体类有不存在数据库中的字段.在改属性上面加上这个注解@Transient就可以解决问题.

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

    .NET的Contract类库是Declarative Programming实践的一部分,可以对日常编程带来很多好处: 提高代码可读性,使用者一看Require, Ensure就知道这方法接受什么输 ...

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

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  5. Asp.net MVC验证那些事(1)-- 介绍和验证规则使用

    数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validation来保证无论是新增或者更新数据的时候,都必须符合我们定义的验证规则,否则就会提示错误. ...

  6. Asp.net MVC验证那些事(1)-- 介绍和验证规则使用----[转]--[并修改了部分内容]

    Asp.net MVC验证那些事(1)-- 介绍和验证规则使用 -----原文地址链接 数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validati ...

  7. MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息

    Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.ComponentModel.DataAnnotations提供的很多的验证规则(Required, StringLe ...

  8. ASP.NET运行时详解 集成模式和经典模式

    遗留问题 在<ASP.NET运行时详解 生命周期入口分析>中遗留两个问题,包括Application的InitInternal方法执行细节.IIS6和II7经典模式请求管道管理类Appli ...

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

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

随机推荐

  1. JavaScript:九种弹出对话框

    [1.最基本的js弹出对话框窗口代码] 这是最基本的js弹出对话框,其实代码就几句非常简单: <script LANGUAGE="javascript"> <!- ...

  2. NIOS II CPU复位异常的原因及解决方案

    NIOS II CPU复位异常的原因及解决方案   近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上 ...

  3. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  4. org.hibernate.TransientObjectException

    使用JPA注解@ManyToMany做一个多对多的用例. 为了避免在删除主表数据时同时级联删除从表数据,JPA官方文档建议在主表的从表字段使用级联注解:CascadeType.PERSIST,Casc ...

  5. JavaScript 网址

    1. javascript 模板引擎 http://aui.github.io/artTemplate/

  6. asp.net导入Excel表

    一.导入Excel的界面这个界面很简单,代码就不列出来了.二.导入的代码我分了两部分,第一部分是点击查看数据的代码,这个是将数据导入到DataTable里面,但是还没有导入到数据库里.这里需要注意的是 ...

  7. JavaScript中创建类,赋值给ajax中的data参数

    缘由:因为要给根据是否选中checkbox来动态增加ajax中data的属性(ajax的data属性格式的几种方法,参考http://www.jb51.net/article/46676.htm) d ...

  8. css不同浏览器兼容性调试 --- 转自: [http://wo.115.com/?ct=detail&id=31733&bid=1018841]

    css不同浏览器兼容性调试 IE6.0,IE7.0与Firefox的CSS兼容性问题1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right ...

  9. springMVC配置freemarker

    这里呢,我首先来说明一下写该篇的目的. 我最近要用到freemarker因此研究了一下这个东西. 先来说说如何配置吧. 1.jar包.地址见下链接. http://pan.baidu.com/s/1j ...

  10. 线程和进程详解(以java为例具体说明)

    详细参见http://ifeve.com/java-concurrency-thread-directory/ 一.线程概述 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早 ...