验证API
验证API
本篇定位在数据入口的验证
- 普通的DataAnnotation验证
- 基于场景的DataAnnotation验证
- 可修改的外置式DataAnnotation验证
SUMMARY
最终调用时的用法:
class Program
{
static void Main(string[] args)
{
A2DFramework.Starter.Init();
A2DFramework.RuleEngine.Starter.Init();
A2DFramework.BusinessExceptionService.Starter.Init(); User user = new User();
user.FirstName = "aaa";
user.CustomField = "aaron";
foreach (var error in user.IsValid())
{
Console.WriteLine(error.Key);
}
Console.WriteLine("===================");
foreach (var error in user.IsValid("场景1"))
{
Console.WriteLine(error.Key);
Console.WriteLine(error.Message);
} Console.ReadKey();
}
}
原理:
基于场景的验证特性实现,举例:RuleDataTypeAttribute
RuleDataTypeAttribute,也就是DataTypeAttribute的场景支持版:
/// <summary>
/// 支持规则场景的验证基类
/// </summary>
public class RuleValidationAttribute : ValidationAttribute
{
public RuleValidationAttribute()
{
this.RuleName = string.Empty;
} public RuleValidationAttribute(string rule)
{
this.RuleName = rule;
} public string RuleName { get; set; } protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return base.IsValid(value, validationContext);
}
} public class RuleDataTypeAttribute : RuleValidationAttribute
{
private DataTypeAttribute checker; public RuleDataTypeAttribute(DataType dataType):this(string.Empty, dataType)
{
}
public RuleDataTypeAttribute(string rule, DataType dataType):base(rule)
{
checker = new DataTypeAttribute(dataType);
} public RuleDataTypeAttribute(string rule, string customDataType)
: base(rule)
{
checker = new DataTypeAttribute(customDataType);
} protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return checker.GetValidationResult(value, validationContext);
}
}
至于基于RuleName的执行验证代码,核心代码:
List<BrokenRule> errors = new List<BrokenRule>(); var descriptor = GetTypeDescriptor(t); foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties())
{
foreach (var validationAttribute in propertyDescriptor.Attributes.OfType<ValidationAttribute>())
{
RuleValidationAttribute baseAttr = validationAttribute as RuleValidationAttribute;
if (baseAttr != null)
{
//支持场景验证
if (baseAttr.RuleName.Equals(scene, StringComparison.OrdinalIgnoreCase))
{
ValidateProperty(o, errors, propertyDescriptor, validationAttribute);
}
}
else
{
//不支持场景的验证
ValidateProperty(o, errors, propertyDescriptor, validationAttribute);
}
}
} private void ValidateProperty(object o, List<BrokenRule> errors, PropertyDescriptor propertyDescriptor, ValidationAttribute validationAttribute)
{
object obj = propertyDescriptor.GetValue(o);
ValidationContext ctx = new ValidationContext(o, null, null);
ValidationResult result = validationAttribute.GetValidationResult(obj, ctx);
if (result != ValidationResult.Success)
{
BrokenRule error = new BrokenRule();
error.Key = propertyDescriptor.Name;
error.Message = validationAttribute.FormatErrorMessage(propertyDescriptor.Name);
errors.Add(error);
}
}
上述代码是实现C#硬编码的验证逻辑,关于外置验证逻辑其实就是上述的另外一份拷贝,只是把里面的某些函数redirect到xml中,略。
具体文本验证逻辑的执行是通过调用js引擎实现,都比较简单。
稍微修改就能实现分布式和统一管理。
验证API的更多相关文章
- Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API
自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...
- 银行卡验证API
一.银联开放平台 https://open.unionpay.com/tjweb/api/detail?apiSvcId=21 应用场景 综合数据服务平台是银联为接入商户提供的综合数据认证服务接口,目 ...
- 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."
API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...
- Yii学习笔记之四(表单验证 api 翻译)
1.表单验证 对于用户输入的全部数据,你不能信任,必须加以验证. 全部框架如此.对于yii 能够使用函数 yii\base\Model::validate() 进行验证 他会返回boolean值的 ...
- JavaScript 验证API
约束验证 DOM 方法 Property Description checkValidity() 如果 input 元素中的数据是合法的返回 true,否则返回 false. setCustomVal ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 验证 API
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...
- API验证及AES加密
API验证 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快,会窃 ...
- 使用Postman验证TFS Rest API
概述 你可能已经了解到,TFS自2015版本发布以来,开始支持通过REST API的方式提供接口服务,第三方平台可以通过通用的HTTP协议访问TFS系统,获取数据.请求编译等.REST API在原有. ...
- CMDB API验证
CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...
随机推荐
- vim note(3)
Ctrl+w Ctrl+v will create a new window on the right side of the current window Ctrl+w Ctrl+s wi ...
- RSA JS 加密解密DEMO
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script&g ...
- SqlServer发送邮件,定时作业
今天偶然研究了一下sqlserver发送邮件的功能,之前听说过可以发,但是一直没尝试过,只是用C#写后台程序的方式来发邮件. 现在又多了一种发送邮件的途径. 大致的步骤如下: 1.配置sqlserve ...
- 配置主机路由表(route)(两)
我们谈到了路由在互联网为基础的时间问题,必须有一个路径之间的两个主机可通信 TCP/IP 合约,否则就不能是有线啊! 一般来说.只要有一个网络接口,的接口将产生的路由.例如,在哥斯达黎加的内部主机鸟有 ...
- BFS、双向BFS和A*
BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...
- [转载]cookie
cookie概述 在上一节,曾经利用一个不变的框架来存储购物栏数据,而商品显示页面是不断变化的, 尽管这样能达到一个模拟 全局变量的功能,但并不严谨.例如在导航框架页面内右击,单击快捷菜单中的[刷新] ...
- mysql_【MySQL】常见的mysql 进程state
Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ). checking permissions 线程是检查服务器是否具有所需的权限来执行该语句. Ch ...
- 浅谈JavaScript中继承的实现
谈到js中的面向对象编程,都有一个共同点,选择原型属性还是构造函数,两者各有利弊,而就片面的从js的对象创建以及继承的实现两个方面来说,官方所推荐的是两个相结合,各尽其责,各取其长,在前面的例子中,我 ...
- [cocos2d-x 3.0] 触摸显示器
一.基本使用 1.首先,声明一个监听器 有两种,EventListenerTouchOneByOne 和 EventListenerTouchAllAtOnce,前者是单点触控.后者是多点触控.后者我 ...
- JS Tree
jQuery插件实例七:一棵Tree的生成史 在需要表示级联.层级的关系中,Tree作为最直观的表达方式常出现在组织架构.权限选择等层级关系中.典型的表现形试类似于: 一颗树的生成常常包括三个部分:1 ...