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. SparkRDD内核

    Spark内核 RDD是基础,是spark中一个基础的抽象,是不可变的,比如我们加载进的数据RDD,如果想更改其中的内容是不允许的:分区的集合,可以并行来计算:RDD类中包含了很多基础的操作,例如ma ...

  2. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  3. 囤题&&发布记录

    声明 && 温馨提示 by ljh2000 听说有人很喜欢狙我......看我不把你们抓起来嘿嘿嘿! 为了采取措施,不让被狙成为生活常态(雾   ,我要闭关锁国辣,我要开始(屯田)囤题 ...

  4. R Customizing graphics

    Customizing graphics GraphicsLaTeXLattice (Treillis) plots In this chapter (it tends to be overly co ...

  5. (转)edm注意事项

    格式编码 1.页面宽度请设定在600到800px以内,长度1024px以内. 2.HTML编码请使用utf-8. 3.HTML代码在15KB以内.(各个邮箱的收件标准不一样,如果超出15KB您的邮件很 ...

  6. node.js redis对事务的控制

    redis对事务的支持还是比较差的,就是把所有的执行命令方到队列中一个一个执行 multi开启一个事务,exec执行事务集合中的命令 代码: var redisClient; redisClient. ...

  7. hdu 1864 最大报销额(01背包)

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. python基础-循环语句while

    循环语句:while\for\嵌套 循环控制语句:break\continue break:跳出整个循环,不会再继续循环下去 continue:跳出本次循环,继续下一次循环 while循环: coun ...

  9. Git_学习_01_ 常用 Git 命令清单

    我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...

  10. 机器学习 Support Vector Machines 3

    Optimal margin classifiers 前面我们讲过,对如下的原始的优化问题我们希望找到一个优化的边界分类器. minγ,w,bs.t.12∥w∥2y(i)(wTx(i)+b)⩾1,i= ...