浅谈.net的后台校验
1.场景描述
在开发中,前端的相关模型校验往往不能满足当前开发的需求,也就是并不是十分的安全。于是,很多情况下需要后端进行模型的校验。在.net mvc中,有很多校验的方式(比如:值(1)可以使用内置的标签的校验模式,.net中内置诸如Require/Range/Phone等校验标签,只需在相应的模型字段上打上对应的标签,在相应的Action内使用ModelState.IsVaild便可以进行校验;(2)使用FluentValidation插件(具体的使用查一下文档即可,也比较简单))。本文先抛开这两款校验组件,使用.net 提供的ValidationContext完成自定义的扩展校验。废话不说,直接上代码。
2.代码分享交流
public class ValidContext
{
/// <summary>
/// 校验当前模型
/// </summary>
/// <param name="model"></param>
/// <param name="errorMsg"></param>
/// <param name="ignores"></param>
/// <returns></returns>
public static bool Check(object model, ref string errorMsg, IEnumerable<string> ignores = null)
{
ValidationContext context = new ValidationContext(model);
List<ValidationResult> results = new List<ValidationResult>();
bool isVail = Validator.TryValidateObject(model, context, results, true);
if (isVail)
{
errorMsg = "验证通过";
return true;
}
//判断是否有需要忽略的
if (ignores != null)
results=results.Where(o =>!ignores.Contains(o.MemberNames.FirstOrDefault())).ToList();
if (results.Count > )
{
errorMsg = results.FirstOrDefault().ErrorMessage;
return false;
}
errorMsg = "验证通过";
return true; } }
/// <summary>
/// 正则表达式常量(随时可扩展)
/// </summary>
public class PattarmConst
{
/// <summary>
/// 邮箱
/// </summary>
public const string IsMail = @"^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$";
/// <summary>
/// 手机号
/// </summary>
public const string IsPhone = @"^1[3|4|5|7|8|9][\d]{9}$";
/// <summary>
/// url
/// </summary>
public const string IsUrl = @"^((https|http|ftp|rtsp|mms){0,1}(:\/\/){0,1})www\.(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$";
/// <summary>
/// 汉字
/// </summary>
public const string IsChinese = @"[\u4e00-\u9fa5]";
/// <summary>
/// 15 or 18位的身份证号
/// </summary>
public const string IsIDCard = @"^\d{15}|\d{18}";
/// <summary>
/// 金额
/// </summary>
public const string IsPrice = @"^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$";
}
/// <summary>
/// 校验属性自定义扩展
/// </summary>
public class RequireExt : ValidationAttribute
{
public RequireType RequireType { get; set; }
public override bool IsValid(object value)
{
if (value == null)
{
return false;
}
string pattarn = string.Empty;
switch (RequireType)
{
case RequireType.PHONE:
pattarn = PattarmConst.IsPhone;
break;
case RequireType.MAIL:
pattarn = PattarmConst.IsMail;
break;
case RequireType.URL:
pattarn = PattarmConst.IsUrl;
break;
case RequireType.IDCARD:
pattarn = PattarmConst.IsIDCard;
break;
case RequireType.PRICE:
pattarn = PattarmConst.IsPrice;
break;
default:
throw new AccessViolationException("未定义的枚举类型");
}
if (!Regex.IsMatch(value.ToString(), pattarn))
{ return false; }
return true;
}
}
/// <summary>
/// 校验枚举类型
/// </summary>
public enum RequireType
{
[Description("手机号")]
PHONE = ,
[Description("邮箱")]
MAIL = ,
[Description("正规URL")]
URL=,
[Description("身份证号")]
IDCARD=,
[Description("金额")]
PRICE=
}
浅谈.net的后台校验的更多相关文章
- 浅谈C++三层架构
浅谈C++三层架构 三层架构并不是MVC,MVC是一个很早就有的经典的程序设计模式,M-V-C分为三层,M(Model)-V(View)-C(Control). web开发中的三层架构是指:数据访问层 ...
- CSRF漏洞原理浅谈
CSRF漏洞原理浅谈 By : Mirror王宇阳 E-mail : mirrorwangyuyang@gmail.com 笔者并未深挖过CSRF,内容居多是参考<Web安全深度剖析>.& ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- Android应用安全开发之浅谈加密算法的坑
<Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题 Android开发中,难免会遇到需要加解密一些数据内 ...
随机推荐
- C++拷贝构造函数(深拷贝,浅拷贝)
http://www.cnblogs.com/BlueTzar/articles/1223313.html C++拷贝构造函数(深拷贝,浅拷贝) 对于普通类型的对象来说,它们之间的复制是很简单的,例如 ...
- Java Applet:练习TextField类和TextArea类的文本事件
出自: Java语言与面向程序程序设计(第二版) 第七章第五节P223 1. [代码]java代码 /** *这个程序主要来练习文本事件,当在文本框(TextField)中输入文字时,会在文本域(Te ...
- 具有增、删、改、查功能的vue-tree树组件
最近写了一个具有增删改查功能的多级树组件,感觉很实用,啦啦啦啦, 废话不多说,看代码: tree.vue <template> <div> <div class=&quo ...
- nodejs 解析 base64 文本
使用Buffer对象,在创建Buffer,指定源的编码方式 Buffer.from(data, 'base64').toString(); 当然如果是解析图片或者二进制数据的话,就不需要toStrin ...
- java正则表达式匹配文本中想要的字符串
需求:获取一个本地文件中所有符合 $[MAKE_PACKAGE] 格式的字符串,并输出到另一个文件中. public static void main(String[] args) throws Ex ...
- centos下安装Mysql5.7.20
0.环境 本文操作系统: CentOS 7.2.1511 x86_64MySQL 版本: 5.7.16 1.卸载系统自带的 mariadb-lib [root@centos-linux ~]# rpm ...
- windows 2013 datacenter 安装sql server2008 r2兼容性
add-windowsfeature RSAT-Clustering-AutomationServer
- 移动端H5 button 默认事件
button 在移动端下会有自带的默认事件,如果不处理的话,点击按钮的时候会有自动刷新页面的效果,原因就是button的默认事件没有阻止. 所以在点击事件里面要加上 e.preventDefault( ...
- 调试 ASP 程序脚本
调试 ASP 脚本 无论您的计划多么精密.经验多么丰富,脚本错误 (bug) 可能在最初就使您的 ASP 服务器端的脚本无法正确运行.也就是说调试,即查找和纠正脚本错误,对开发一个成功的和强健的 AS ...
- JS通过经纬度计算两个地方的距离
1 主要原理: Lat1 Lung1 表示A点纬度和经度,Lat2 Lung2 表示B点纬度和经度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差: 63 ...