XAF应用开发教程(五)验证模块
数据验证是应用程序开发中使用频率最高的功能模块,本节详细介绍一下XAF中如何使用验证模块。
XAF 验证模块内置了下面的一些验证规则:
|
验证规则类型 |
说明 |
|---|---|
| RuleCombinationOfPropertiesIsUnique (RuleCombinationOfPropertiesIsUniqueAttribute) | 要求多个属性的值组合在一起时是唯一的. |
| RuleCriteria (RuleCriteriaAttribute) | 要求满足指定的条件. 如:座机或手机必须填写一个。 条件为:坐机 is not null or 手机 is not null |
| RuleFromBoolProperty (RuleFromBoolPropertyAttribute) | 要求指定的boolean类型的属性的值必须为真.比如注册用户时必须选中同意一系列的条款。 |
| RuleIsReferenced (RuleIsReferencedAttribute) | 要求必须被引用的. |
| RuleObjectExists (RuleObjectExistsAttribute) | 要求对象是必须存在的. |
| RuleRange (RuleRangeAttribute) | 要求值必须在一定的范围内. |
| RuleRegularExpression (RuleRegularExpressionAttribute) | 要求输入的值必须是满足正则表达式的. |
| RuleRequiredField (RuleRequiredFieldAttribute) | 要求值是必填写的. |
| RuleStringComparison (RuleStringComparisonAttribute) | 要求字符串必须符合某种比较的条件. |
| RuleValueComparison (RuleValueComparisonAttribute) | 要求值必须是符合某种比较条件. |
| RuleUniqueValue (RuleUniqueValueAttribute) | 要求值必须是唯一的. |
为了更直观的理解,我们先上一个效果图。从必填验证说起:

如上图所示,在按下了保存、保存关闭、保存新建 按钮之后,会出现一个错误提示信息。同时,在姓名文本框前面会出现一个红色报错的图标。这个效是怎么实现的呢?
public class 客户........
{
....................
private string _姓名; [RuleRequiredField(CustomMessageTemplate ="请填写姓名!")]
public string 姓名
{
get { return _姓名; }
set { SetPropertyValue("姓名", ref _姓名, value); }
}
...................
我在前面使用的项目中,打开了客户.cs文件,并在客户类的姓名属性上增加了一行
[RuleRequiredField(CustomMessageTemplate ="请填写姓名!")]
是的只需要这样一行就可以了。 这样,XAF为我们生成了一条验证规则,规则的名称是自动指定的,一系列相关的也都用了默认值,我们修改一下代码,指定下名称:
[RuleRequiredField("客户姓名必填", DefaultContexts.Save,CustomMessageTemplate ="请填写姓名!")]
第一个参数为规则的名称,DefaultContexts.Save是指在保存这个上下文时才执行验证。
编译后,打开xafml文件,可以看到这么规则的所有信息:

按照左侧红框中的路径,最终点击结点“客户姓名必填”后,右侧出现了此规则的详细信息,其中格式这一分组内的设置都是显示消息类的。可以进行一下汉化。
带有地球图标的,都是需要本地化的属性。
行为一栏中:
InvertResult:反转结果,当设置为True时,即验证的结果如果是没通过,则认为通过,即是否通过的结果取反,这个选项在必填验证是没什么用的,我们不可能做一个验证规则要实现某些属性必须不能填值的。
ResultType:Error,Warning,Information三种,其中:
Error:当不满足验证规则时,报个错误出来,并且不能继续操作程序。上面演示的验证规则就是这样效果了。
Warning:当不满足验证规则时,显示一个警告信息,确认后,继续程序运行。
比如:客户信息中有个地址属性,当然我们是希望填写地址的,如果不填写,有市场活动举行时,我们有一些礼品就没办法寄送给客户。此时,我们可以增加一条这样的规则,但如果确定得不到地址,也只能不填写了,但要提示操作人员。

按下保存时,可以看到地址文本框前面出现了一个黄色感叹号图标。在错误信息提示的位置,出现了一个checkbox,文字是Ignore warnings,当选中了checkbox后,再次按保存时,则不在提示此信息了。
下面我们再来看看将ResultType修改为Information时的效果:

代码:
private string _地址;
[RuleRequiredField(ResultType = ValidationResultType.Warning,CustomMessageTemplate ="如果不填写地址,市场活动礼品将无法送达,确认不填写吗?")]
public string 地址{
get { return _地址; }
set { SetPropertyValue("地址", ref _地址, value); }
}
由于姓名没有填写,触发了必填规则,同时显示出了地址的信息,但可以不去纠正,只是显示出信息。
当,姓名填写了时,地址的消息是不会显示的,此时,点击Validation按钮会看到提示信息:

private string _地址;
[RuleRequiredField(ResultType = ValidationResultType.Information,CustomMessageTemplate ="如果不填写地址,市场活动礼品将无法送达,确认不填写吗?")]
public string 地址{
get { return _地址; }
set { SetPropertyValue("地址", ref _地址, value); }
}
接下来看xafml中规则的 SkipNullOrEmptyValues,这个选项在必填验证时没有意义,但在别的规则中是有意义的,比如:地址必须以“上海市”开头,如果没有填写则不验证,那么把此值设置成True即可。

代码:
private string _地址;
[RuleRequiredField(ResultType = ValidationResultType.Information,CustomMessageTemplate ="如果不填写地址,市场活动礼品将无法送达,确认不填写吗?")]
[RuleStringComparison("地址必须开始于上海市", DefaultContexts.Save, StringComparisonType.StartsWith,"上海市",SkipNullOrEmptyValues =true)]
public string 地址{
get { return _地址; }
set { SetPropertyValue("地址", ref _地址, value); }
}
如果没有填写地址时,规则并不会生效。保存是直接通过的,这就是SkipNullOrEmptyValues的作用。
TargetContextIDs:这个属性是个字会串,可以随意填写。首先来看一下什么是Context,即上下文:
上下文是指让验证规则生效的一个环境,比如保存数据时,审核数据时,删除数据时,入库时,等等 ,但系统其实只提供了两个默认的上下文环境,我们前面使用了
DefaultContexts.Save 这个枚举,可以看他的定义(我使用的是Reflector查看的):
[Flags]
public enum DefaultContexts
{
Delete = ,
Save =
}
可以看到这个枚举是Flags,也就是说,多个值是可以同时使用的。只定义了删除、保存。
系统内置的上下文环境只有这两种,当然我们可以定义自己的上下文环境,请看下一节中的自定义上下文。
我们可以看到在xafml的规则中,有很多的属性,其实在代码中这些属性都是可以控制的,在书写Attribute时,我们可以利用VS的智能感知,查看有哪些参数可以设置,对照着XAFML中的信息,就能知道功能了。
XAF应用开发教程(五)验证模块的更多相关文章
- Xamarin Anroid开发教程之验证环境配置是否正确
Xamarin Anroid开发教程之验证环境配置是否正确 经过前面几节的内容已经把所有的编程环境设置完成了,但是如何才能确定所有的一切都处理争取并且没有任何错误呢?这就需要使用相应的实例来验证,本节 ...
- XAF应用开发教程(一) 创建项目
XAF是DevExpress公司的快速开发框架,全称eXpress Application Framework,是企业信息系统的开发利器,快速开发效果显著,在.net框架中,笔者至今没有找到一款可以与 ...
- XAF应用开发教程(七)外观控制模块
很多时候,我们需要按照不同的条件显示不同的效果,在传统的软件开发中,我们会直接使用 控件名称.BackColor,Enable,Visible等属性进行控制. 如果一个业务对象在多处使用,要么我们会去 ...
- XAF应用开发教程(四)应用程序模型
XAF是重量型框架,确实够重量的,方方面面都做得规规矩矩. 如果看了前面三节,可能会认为,这N多的Attribute到底都是从哪里来的?到底有多少这样的Attribute?如果不够用了怎么办?等着官方 ...
- XAF应用开发教程-内置Attribute功能列表
在 XAF 框架,一些用来生成一个业务应用程序的信息是在Attribute中指定.您可以将属性应用到业务类 (或它的成员) 指定验证规则,指定如何对数据进行显示. 设置关系类等.本主题提供了有关在何处 ...
- XAF应用开发教程(六)控制器
是的,XAF也是MVC结构的,但不仅限于MVC,ViewModel也存在,它是一项复合技术,AOP,ORM,MVC都有. 真实运行的系统中,仅有增删改查功能肯定是远远不够的,ERP.CRM等系统的开发 ...
- Odoo 二次开发教程(五)-新API的介绍与应用
[关于odoo新API的介绍,Internet上资料很少,或者不够完整详实,这会对初学者造成很大的困惑,本篇的目的就是希望能帮助新手了解新API的大概] odoo 新api的实现是借助于python装 ...
- XAF应用开发教程(八) 汉化与多国语言支持
使用了XAF开发时,汉化是一个比较常的问题. 要实现汉化很简单: 1.在这里下载汉化资源文件.这里演示的版本是15.1.X的 2.文件下载后将:文件解压到目录 <你的项目>\BIN\ ...
- XAF应用开发教程(三)业务对象模型之引用类型与关联关系
本节介绍信息系统开发中最常见的问题,引用关系,一对多关系,多对多关系. 以客户信息为例,客户通常需要客户分类,如VIP客户,普通客户,潜在客户.当然,我们可以定义枚举类型进行定义出这个类型,并在客户类 ...
随机推荐
- mysql datetime设置now()无效,直接用程序设置默认值比较好
mysql datetime设置now()无效的,没有此用法,datetime类型不能设置函数式默认值,只能通过触发器等来搞.想设置默认值,只能使用timestamp类型,然后默认值设置为:CURRE ...
- SqlParameter
List<SqlParameter> parameters = new List<SqlParameter>(); SqlParameter param; foreach (. ...
- 【JQGRID DOCUMENTATION】.学习笔记.2.基本表格
JqGrid的实例是一个JavaScript对象,带有属性,事件和方法.属性可以是字符串,数字,数组,布尔值或任何其他对象. 1 调用的约定: $("#grid_id").jqGr ...
- Discuz2 x3深入研究内容资料
http://blog.csdn.net/yanhui_wei/article/category/1136193
- App store 如何使用 promo code | app store 打不开精品推荐和排行榜
1. app store 如何使用 promo code: 在app store的 右下角精品推荐标签页,拉到最下面 点击“兑换” ,跳转到新的页面,输入兑换码,然后右上角“兑换”,程序开始自动下载并 ...
- ACM题目————一笔画问题
描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N< ...
- poj2429 GCD & LCM Inverse
用miller_rabin 和 pollard_rho对大数因式分解,再用dfs寻找答案即可. http://poj.org/problem?id=2429 #include <cstdio&g ...
- Java学习之路(二)
什么是变量? 1:计算机是一种嫉妒精确的机器 2:要将信息存储在计算机当中,就必须指明信息存储的位置和所需的内存空间: 3:在Java当中 使用声明语句来完成上述任务 变量的类型:
- 过滤DataTable中的空数据
DataTable dt = new DataTable(tableName); for (int i = 0; i < columnsNames.Length; i++) { dt.Colum ...
- U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系
Unity官方有一个详细的碰撞关系表:http://docs.unity3d.com/Manual/CollidersOverview.html 但其实可以精简为以下几点: 1.两个勾选kinemat ...