浅谈.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开发中,难免会遇到需要加解密一些数据内 ...
随机推荐
- SparkRDD内核
Spark内核 RDD是基础,是spark中一个基础的抽象,是不可变的,比如我们加载进的数据RDD,如果想更改其中的内容是不允许的:分区的集合,可以并行来计算:RDD类中包含了很多基础的操作,例如ma ...
- 大话设计模式--解释器模式 interpreter -- C++实现实例
1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...
- 囤题&&发布记录
声明 && 温馨提示 by ljh2000 听说有人很喜欢狙我......看我不把你们抓起来嘿嘿嘿! 为了采取措施,不让被狙成为生活常态(雾 ,我要闭关锁国辣,我要开始(屯田)囤题 ...
- R Customizing graphics
Customizing graphics GraphicsLaTeXLattice (Treillis) plots In this chapter (it tends to be overly co ...
- (转)edm注意事项
格式编码 1.页面宽度请设定在600到800px以内,长度1024px以内. 2.HTML编码请使用utf-8. 3.HTML代码在15KB以内.(各个邮箱的收件标准不一样,如果超出15KB您的邮件很 ...
- node.js redis对事务的控制
redis对事务的支持还是比较差的,就是把所有的执行命令方到队列中一个一个执行 multi开启一个事务,exec执行事务集合中的命令 代码: var redisClient; redisClient. ...
- hdu 1864 最大报销额(01背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- python基础-循环语句while
循环语句:while\for\嵌套 循环控制语句:break\continue break:跳出整个循环,不会再继续循环下去 continue:跳出本次循环,继续下一次循环 while循环: coun ...
- Git_学习_01_ 常用 Git 命令清单
我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...
- 机器学习 Support Vector Machines 3
Optimal margin classifiers 前面我们讲过,对如下的原始的优化问题我们希望找到一个优化的边界分类器. minγ,w,bs.t.12∥w∥2y(i)(wTx(i)+b)⩾1,i= ...