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的后台校验的更多相关文章

  1. 浅谈C++三层架构

    浅谈C++三层架构 三层架构并不是MVC,MVC是一个很早就有的经典的程序设计模式,M-V-C分为三层,M(Model)-V(View)-C(Control). web开发中的三层架构是指:数据访问层 ...

  2. CSRF漏洞原理浅谈

    CSRF漏洞原理浅谈 By : Mirror王宇阳 E-mail : mirrorwangyuyang@gmail.com 笔者并未深挖过CSRF,内容居多是参考<Web安全深度剖析>.& ...

  3. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  4. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  5. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  6. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  7. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  8. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  9. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

随机推荐

  1. matlab之fliplr()函数

    fliplr  左右翻转矩阵 语法: B = fliplr(A) 将矩阵A的列绕垂直轴进行左右翻转 matabc 如果A是一个行向量,fliplr(A)将A中元素的顺序进行翻转. 如果A是一个列向量, ...

  2. 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 ...

  3. Linux_服务器_08_网卡eth1修改为eth0

    一.现象 二.解决步骤 1.修改 70-persistent-net.rules 执行命令: vim /etc/udev/rules.d/-persistent-net.rules 找到与ifconf ...

  4. hibernate复习第(二)天

    今日要点: 关联映射 多对一(Employee - Department) 一对多(Department - Employee) 一对一(Person - IdCard) 多对多(teachet - ...

  5. 谈MicroMessageTest的开始创建

    一开始,创建一个可以看到的jsp前端页面. 只不过不是用纯jsp页面访问,而是用Servlet doGet跳转至jsp页面,req.getRequestDispatcher(jsp页面的全称 还是全地 ...

  6. 【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 ...

  7. 基于Ubuntu交叉编译FFmpeg Windows SDK

    写在前面 FFmpeg是一个开源且跨平台的音视频解决方案,集采集.转码.流式化为一身,项目的libavcodec编解码模块和libavformat媒体格式模块,支持非常非常丰富的编解码格式和容器封装格 ...

  8. [转]CSS禁止文字选择

    user-select有两个值: none:用户不能选择文本 text:用户可以选择文本 需要注意的是:user-select并不是一个W3C的CSS标准属性,浏览器支持的不完整,需要对每种浏览器进行 ...

  9. EventLoop 与 Channel 的关联

    Netty 中, 每个 Channel 都有且仅有一个 EventLoop 与之关联, 它们的关联过程如下: 从上图中我们可以看到, 当调用了 AbstractChannel#AbstractUnsa ...

  10. SQL Server BCP 资料导入导出

    SQL Server BCP 导入导出使用 Bcp 导出导入数据高效,比使用SQL Server Management Stdio 提供的数据库导出导入要高效因为sql server 也没有提供提供类 ...