XAF实现运行时填加验证规则并保存到数据库中
有 几种 方法 可以 用来 声明 一个 验证 规则 。 最常用的方法是使用对应的Attribute来定义。详见这里。 验证 模块还 允许 您 通过 在 业务 类 实现 IRuleSource 接口 定义 自定义 的 验证 规则的来 源 。 IRuleSource 接口 公开 两个 成员 。 名称 属性 应
有几种方法可以用来声明一个验证规则。最常用的方法是使用对应的Attribute来定义。详见这里。验证模块还允许您通过在业务类实现 IRuleSource 接口定义自定义的验证规则的来源。 IRuleSource 接口公开两个成员。名称属性应返回自定义的验证规则源的唯一名称。CreateRules 方法应实例化自定义的验证规则。 一个场景中,您可能需要实现自定义验证规则来源执行验证规则存储在数据库中。可以使用这种方法,当您需要频繁地自定义验证规则在已部署的应用程序中,但您不能重新部署应用程序或自定义其应用程序模型。 下面的示例阐释了此方案。
此示例所示的 RuleRequiredFieldPersistent 类是一个普通的业务类。类实现 IRuleSource 接口,并用于创建和存储在数据库中的 RuleRequiredField 验证规则。在 CreateRules 方法中实例化一个 RuleRequiredField 验证规则,基于 RuleRequiredFieldPersistent 类的公共属性的值。RuleRequiredFieldPersistent 类标记 DefaultClassOptionsAttribute,以便最终用户可以手动创建验证规则通过相应的列表视图。
<span style="color: #000000;">[DefaultClassOptions] </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RuleRequiredFieldPersistent : BaSEObject, DevExPRess.Persistent.Validation.IRuleSource { </span><span style="color: #0000ff;">public</span> RuleRequiredFieldPersistent(session session) : <span style="color: #0000ff;">base</span><span style="color: #000000;">(session) { } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> RuleName { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuestring>(<span style="color: #800000;">"</span><span style="color: #800000;">RuleName</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">RuleName</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> CustomMessageTemplate { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuestring>(<span style="color: #800000;">"</span><span style="color: #800000;">CustomMessageTemplate</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">CustomMessageTemplate</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> SkipNullOrEmptyValues { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuebool>(<span style="color: #800000;">"</span><span style="color: #800000;">SkipNullOrEmptyValues</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">SkipNullOrEmptyValues</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> Id { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuestring>(<span style="color: #800000;">"</span><span style="color: #800000;">Id</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">Id</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> InvertResult { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuebool>(<span style="color: #800000;">"</span><span style="color: #800000;">InvertResult</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">InvertResult</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> ContextIDs { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuestring>(<span style="color: #800000;">"</span><span style="color: #800000;">ContextIDs</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">ContextIDs</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> Property { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValuestring>(<span style="color: #800000;">"</span><span style="color: #800000;">Property</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">Property</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } [Persistent(</span><span style="color: #800000;">"</span><span style="color: #800000;">ObjectType</span><span style="color: #800000;">"</span><span style="color: #000000;">)] </span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> ObjectType { </span><span style="color: #0000ff;">get</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">if</span>(ObjectTypeCore != <span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> ObjectTypeCore.FullName; } </span><span style="color: #0000ff;">return</span> <span style="color: #800000;">""</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">set</span> { ObjectTypeCore =<span style="color: #000000;"> ReflectionHelper.FindType(value); } } [NonPersistent] [TypeConverter(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(DevExpress.Persistent.Base.LocalizedClassInfoTypeConverter))] </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Type ObjectTypeCore { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetPropertyValue<type>(<span style="color: #800000;">"</span><span style="color: #800000;">ObjectTypeCore</span><span style="color: #800000;">"</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">set</span> { SetPropertyValue(<span style="color: #800000;">"</span><span style="color: #800000;">ObjectTypeCore</span><span style="color: #800000;">"</span><span style="color: #000000;">, value); } } </span><span style="color: #0000ff;">#region</span> IRuleSource Members <span style="color: #0000ff;">public</span> System.Collections.Generic.ICollection<irule><span style="color: #000000;"> CreateRules() { System.Collections.Generic.List</span><irule> list = <span style="color: #0000ff;">new</span> System.Collections.Generic.List<irule><span style="color: #000000;">(); RuleRequiredField rule </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> RuleRequiredField(); rule.Properties.SkipNullOrEmptyValues </span>= <span style="color: #0000ff;">this</span><span style="color: #000000;">.SkipNullOrEmptyValues; rule.Properties.Id </span>= <span style="color: #0000ff;">this</span><span style="color: #000000;">.Id; rule.Properties.InvertResult </span>= <span style="color: #0000ff;">this</span><span style="color: #000000;">.InvertResult; rule.Properties.CustomMessageTemplate </span>= <span style="color: #0000ff;">this</span><span style="color: #000000;">.CustomMessageTemplate; rule.Properties.TargetContextIDs </span>= <span style="color: #0000ff;">new</span> ContextIdentifiers(<span style="color: #0000ff;">this</span><span style="color: #000000;">.ContextIDs); rule.Properties.TargetType </span>= <span style="color: #0000ff;">this</span><span style="color: #000000;">.ObjectTypeCore; </span><span style="color: #0000ff;">if</span>(rule.Properties.TargetType != <span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">foreach</span>(PropertyInfo pi <span style="color: #0000ff;">in</span><span style="color: #000000;"> rule.Properties.TargetType.GetProperties()) { </span><span style="color: #0000ff;">if</span>(pi.Name == <span style="color: #0000ff;">this</span><span style="color: #000000;">.Property) { rule.Properties.TargetPropertyName </span>=<span style="color: #000000;"> pi.Name; } } } </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i = Validator.RuleSet.RegisteredRules.Count - <span style="color: #800080;">1</span>; i >= <span style="color: #800080;">0</span>; i--<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(Validator.RuleSet.RegisteredRules[i].Id == <span style="color: #0000ff;">this</span><span style="color: #000000;">.Id) { Validator.RuleSet.RegisteredRules.RemoveAt(i); } } list.Add(rule); </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list; } [Browsable(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)] </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> Name { </span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.RuleName; } } </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;"> }</span></irule></irule></irule></type>
可以看到,这个示例中,只返回了一个规则,而在实际项目中,可以使用BO定义一个子集合,集合中定义N种规则。
不要定义N个BO并都实现 IRuleSource 那样有点浪费。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

可以通过使用gjson库或json.Unmarshal函数将JSON数据保存到MySQL数据库中。gjson库提供了方便的方法来解析JSON字段,而json.Unmarshal函数需要一个目标类型指针来解组JSON数据。这两种方法都需要准备SQL语句和执行插入操作来将数据持久化到数据库中。

在Golang中使用数据库回调函数可以实现:在指定数据库操作完成后执行自定义代码。通过单独的函数添加自定义行为,无需编写额外代码。回调函数可用于插入、更新、删除和查询操作。必须使用sql.Exec、sql.QueryRow或sql.Query函数才能使用回调函数。

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

通过Go标准库database/sql包,可以连接到MySQL、PostgreSQL或SQLite等远程数据库:创建包含数据库连接信息的连接字符串。使用sql.Open()函数打开数据库连接。执行SQL查询和插入操作等数据库操作。使用defer关闭数据库连接以释放资源。
