浅谈.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开发中,难免会遇到需要加解密一些数据内 ...
随机推荐
- matlab之fliplr()函数
fliplr 左右翻转矩阵 语法: B = fliplr(A) 将矩阵A的列绕垂直轴进行左右翻转 matabc 如果A是一个行向量,fliplr(A)将A中元素的顺序进行翻转. 如果A是一个列向量, ...
- Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext.xml]
Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined ...
- Linux_服务器_08_网卡eth1修改为eth0
一.现象 二.解决步骤 1.修改 70-persistent-net.rules 执行命令: vim /etc/udev/rules.d/-persistent-net.rules 找到与ifconf ...
- hibernate复习第(二)天
今日要点: 关联映射 多对一(Employee - Department) 一对多(Department - Employee) 一对一(Person - IdCard) 多对多(teachet - ...
- 谈MicroMessageTest的开始创建
一开始,创建一个可以看到的jsp前端页面. 只不过不是用纯jsp页面访问,而是用Servlet doGet跳转至jsp页面,req.getRequestDispatcher(jsp页面的全称 还是全地 ...
- 【leetcode刷题笔记】Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- 基于Ubuntu交叉编译FFmpeg Windows SDK
写在前面 FFmpeg是一个开源且跨平台的音视频解决方案,集采集.转码.流式化为一身,项目的libavcodec编解码模块和libavformat媒体格式模块,支持非常非常丰富的编解码格式和容器封装格 ...
- [转]CSS禁止文字选择
user-select有两个值: none:用户不能选择文本 text:用户可以选择文本 需要注意的是:user-select并不是一个W3C的CSS标准属性,浏览器支持的不完整,需要对每种浏览器进行 ...
- EventLoop 与 Channel 的关联
Netty 中, 每个 Channel 都有且仅有一个 EventLoop 与之关联, 它们的关联过程如下: 从上图中我们可以看到, 当调用了 AbstractChannel#AbstractUnsa ...
- SQL Server BCP 资料导入导出
SQL Server BCP 导入导出使用 Bcp 导出导入数据高效,比使用SQL Server Management Stdio 提供的数据库导出导入要高效因为sql server 也没有提供提供类 ...