ASP.NET MVC和WebForm 轻松实现前端和后端的双重验证 jquery.validate+ValidationSugar
上次不足的改进
可能上一个贴子给大家带来很多误解,所以我这次把DEMO完善了两个版本 【ASP.NET WEBFROM】和【 ASP.NET MVC】
修改了一些BUG,并且修改了一些细了
在上个贴子里有人说,看了response.write就全身不舒服,所以也就写了基于异步提交的例子
功能介绍
ValidationSugar.cs 负责后台验证和前端 form 元素的 验证 属性绑定
ValidationSugar.js 对 jquery.validate在进行了一个封装来负责前端的验证
注意:ValidationSugar.cs
现在可以支持
1、HTML5默认验证功能
2、jquery.validate
3、webform demo1里面的一个HTML5+CSS3的验证
其它的前端验证可以自已去扩展
后台:
前台:
1、先引用4个脚本:
<script src="/Content/jquery-validation-1.13.1/lib/jquery-1.9.1.js" type="text/javascript"></script>
<script src="/Content/jquery-validation-1.13.1/dist/jquery.validate.js"></script>
<script src="/Content/ValidationSugar.js" type="text/javascript"></script>
<script src="/Content/jquery-validation-1.13.1/lib/jquery.form.js" type="text/javascript"></script>
2、脚本调用就这么简单
<script type="text/javascript">
$(function () {
var factory = new validateFactory($("form"));
factory.init(); $("#btnSubmit").click(function () {
//异步方式
factory.ajaxSubmit(function () {
$("form").ajaxSubmit({
type: "post",
url: "/home/post",
dataType:"json",
success: function (msg) {
alert(msg.Message)
}
})
});
}); });
</script>
3、HTML代码
DEMO下载地址:http://git.oschina.net/sunkaixuan/ValidationSuarMVC (包含WEBFROM)
因为才写了2天难免会有没有考虑到的地方,我在以后工作中慢慢更新的,谢谢观看。
封装代码:
ValidationSugar.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; namespace SyntacticSugar
{
/// <summary>
/// ** 描述:可以方便实现前后端双验证,基于jquery
/// ** 创始时间:2015-6-4
/// ** 修改时间:-
/// ** 作者:sunkaixuan
/// ** 使用说明:http://www.cnblogs.com/sunkaixuan/p/4550580.html
/// ** git: http://git.oschina.net/sunkaixuan/SyntacticSugar
/// </summary>
public class ValidationSugar
{ private static List<ValidationOption> ValidationOptionList = new List<ValidationOption>(); /// <summary>
/// 前台注入
/// </summary>
/// <param name="pageKey"></param>
/// <param name="itemList"></param>
public static string GetInitScript(string pageKey, List<OptionItem> itemList)
{
//初始化后不在赋值
if (ValidationOptionList.Any(it => it.PageKey == pageKey))
{
ValidationOptionList.RemoveAll(it => it.PageKey == pageKey);
} ValidationOption option = new ValidationOption();
string uk = Guid.NewGuid().ToString().Replace("-", "");//唯一函数名
string script = @"<script>
var bindValidation{1}=function(name,params){{
var selectorObj=$(""[name='""+name+""']"").last();
selectorObj.after(""<span class=\""form_hint\"">""+params.tip+""</span>"");
if(params.pattern!=null)
selectorObj.attr(""pattern"",params.pattern);
if(params.placeholder!=null)
selectorObj.attr(""placeholder"",params.placeholder);
if(params.isRequired==true)
selectorObj.attr(""required"",params.isRequired);
}}
{0}</script>";
StringBuilder itemsCode = new StringBuilder();
foreach (var item in itemList)
{
switch (item.Type)
{
case OptionItemType.Mail:
item.Pattern = @"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
break;
case OptionItemType.Int:
item.Pattern = @"^\\d{1,11}$";
break;
case OptionItemType.Double:
item.Pattern = @"^\\d{1,11}$";
break;
case OptionItemType.IdCard:
item.Pattern = @"^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$";
break;
case OptionItemType.Date:
item.Pattern = @"^(((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(10|12|0?[13578])([-\\/])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(11|0?[469])([-\\/])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(0?2)([-\\/])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/])(0?2)([-\\/])(29)$)|(^([3579][26]00)([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][0][48])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][0][48])([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][2468][048])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][2468][048])([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][13579][26])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][13579][26])([-\\/])(0?2)([-\\/])(29))|(((((0[13578])|([13578])|(1[02]))[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9])|(3[01])))|((([469])|(11))[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9])|(30)))|((02|2)[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9]))))[\\-\\/\\s]?\\d{4})(\\s(((0[1-9])|([1-9])|(1[0-2]))\\:([0-5][0-9])((\\s)|(\\:([0-5][0-9])\\s))([AM|PM|am|pm]{2,2})))?$";
break;
case OptionItemType.Mobile:
item.Pattern = @"^[0-9]{11}$";
break;
case OptionItemType.Telephone:
item.Pattern = @"^(\\(\\d{3,4}\\)|\\d{3,4}-|\\s)?\\d{8}$";
break;
case OptionItemType.Fax:
item.Pattern = @"^[+]{0,1}(\\d){1,3}[ ]?([-]?((\\d)|[ ]){1,12})+$";
break;
case OptionItemType.Regex:
item.Pattern = item.Pattern.Replace(@"\", @"\\");
break;
}
itemsCode.AppendFormat("bindValidation{0}('{1}',{{ tip:'{2}',pattern:'{3}',placeholder:'{4}',isRequired:{5} }})", uk, item.FormFiledName, item.Tip, item.Pattern, item.Placeholder, item.IsRequired ? "true" : "false");
itemsCode.AppendLine();
}
option.Script = string.Format(script, itemsCode.ToString(), uk);
script = null;
itemsCode.Clear();
option.PageKey = pageKey;
option.ItemList = itemList;
ValidationOptionList.Add(option);
return (option.Script); } /// <summary>
/// 后台验证
/// </summary>
/// <param name="pageKey"></param>
/// <param name="errorMessage">json格式</param>
/// <returns></returns>
public static bool PostValidation(string pageKey, out string errorMessage)
{
bool isSuccess = true;
errorMessage = string.Empty;
if (!ValidationOptionList.Any(c => c.PageKey == pageKey))
{
throw new ArgumentNullException("ValidationSugar.PostValidation.pageKey");
}
var context = System.Web.HttpContext.Current;
var itemList = ValidationOptionList.Where(c => c.PageKey == pageKey).Single().ItemList;
var successItemList = itemList.Where(it => (it.IsRequired && !string.IsNullOrEmpty(context.Request[it.FormFiledName]) || !it.IsRequired)).Where(it =>
{
if (it.IsMultiselect == true)
{
var errorList = context.Request[it.FormFiledName].Split(',').Where(itit =>
{
var isNotMatch = !Regex.IsMatch(itit, it.Pattern.Replace(@"\\", @"\"));
return isNotMatch; }).ToList();
return errorList.Count == ;
}
else
{
return Regex.IsMatch(context.Request[it.FormFiledName], it.Pattern.Replace(@"\\", @"\"));
}
}
).ToList();
isSuccess = (successItemList.Count == itemList.Count);
if (!isSuccess)
{
errorMessage = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(itemList);
}
return isSuccess;
} private class ValidationOption
{
public string PageKey { get; set; }
public string Script { get; set; }
public List<OptionItem> ItemList { get; set; } } public enum OptionItemType
{
Mail = ,
Int = ,
Double = ,
IdCard = ,
Date = ,
/// <summary>
/// 移动电话
/// </summary>
Mobile = ,
/// <summary>
/// 座机
/// </summary>
Telephone = ,
Fax = ,
/// <summary>
/// 没有合适的,请使用正则验证
/// </summary>
Regex = }
/// <summary>
/// 验证选项
/// </summary>
public class OptionItem
{
/// <summary>
/// 验证类型
/// </summary>
public OptionItemType Type { get; set; }
/// <summary>
/// 正则
/// </summary>
public string Pattern { get; set; }
/// <summary>
/// 是否必填
/// </summary>
public bool IsRequired { get; set; }
/// <summary>
/// 表单字段名(name或者id)
/// </summary>
public string FormFiledName { get; set; }
/// <summary>
/// 水印
/// </summary>
public string Placeholder { get; set; }
/// <summary>
/// 提醒
/// </summary>
public string Tip { get; set; }
/// <summary>
/// 是多选吗? 默认false
/// </summary>
public bool IsMultiselect { get; set; } }
}
}
validationSagur.js:
//基于validate验证
//作者:sunkaixuan
//时间:2015-6-5
var validateFactory = function (form) {
this.init = function () {
addMethod();
bind();
}
this.submit = function () {
if (form.data("validateFactory")) {
form.data("validateFactory").form();
}
}
this.ajaxSubmit = function (rollback) {
if (form.data("validateFactory")) {
if (form.valid()) {
if (rollback != null) {
rollback();
}
}
}
}
function addMethod() {
form.find("[pattern]").each(function () {
var th = $(this);
var pattern = GetPattern(th);
var methodName = GetMdthodName(th);
$.validator.addMethod(methodName, function (value, element, params) {
return this.optional(element) || new RegExp(pattern).test(value);
}, GetTip(th));
});
}
function bind() {
var rules = {};
var messages = {};
form.find("[pattern]").each(function () {
var th = $(this);
var methodName = GetMdthodName(th);
var name = GetName(th);
rules[name] = {};
rules[name][methodName] = true;
if (GetIsRequired(th)) {
rules[name].required = true; messages[name] = {};
messages[name].required = "不能为空!";
} });
var v = form.validate({
onfocusout: function (element) {
$(element).valid();
},
onkeyup: function (element) {
$(element).valid();
},
rules: rules,
messages: messages,
debug: false,
errorPlacement: function (error, element) {
if (element.is(":radio,:checkbox")) {
element.parent().append(error);
} else {
element.after(error);
}
}
});
form.data("validateFactory", v);
} function GetMdthodName(ele) {
return ele.attr("name") + "ValidateMethod";
}
function GetName(ele) {
return ele.attr("name");
}
function GetPattern(ele) {
return ele.attr("pattern");
}
function GetTip(ele) {
return ele.next().text();
}
function GetIsRequired(ele) {
if (ele.attr("required")) {
return true;
} else {
return false;
}
}
};
ASP.NET MVC和WebForm 轻松实现前端和后端的双重验证 jquery.validate+ValidationSugar的更多相关文章
- (读书笔记)Asp.net Mvc 与WebForm 混合开发
根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ...
- ASP.NET MVC与WebForm区别
[转贴一] 使用ASP.NET MVC框架,创建默认项目,第一直观感觉就是地址都是Rewrite过的.对源码和配置文件稍加分析不难看出,MVC使用了httpModules来拦截地址请求,具体用到了Sy ...
- ASP.NET MVC显示WebForm网页或UserControl控件
ASP.NET MVC显示WebForm网页或UserControl控件 学习与使用ASP.NET MVC这样久,还是对asp.net念念不忘.能否在asp.net mvc去显示aspx或是user ...
- Asp.net Mvc 与WebForm 混合开发
根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Web ...
- [转]Asp.net Mvc 与WebForm 混合开发
本文转自:https://www.cnblogs.com/dooom/archive/2010/10/17/1853820.html 根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与W ...
- MVC自定义验证 jquery.validate.unobtrusive
MVC的验证 jquery.validate.unobtrusive 阅读目录 一.应用 二.验证规则 1.一.简单规则 2.二.复杂一点的规则 3.三.再复杂一点的规则(正则) 4.四.再再复杂一点 ...
- asp.net MVC 和 webForm的区别
asp.net MVC请求过程 ASP.NET MVC框架只是给开发者提供了开发web应用程序的一种选择,并不是要取代Webform这两种技术各有优缺点,开发者需要根据实际情况,选择对应的技术有时候, ...
- 念念不忘,ASP.NET MVC显示WebForm网页或UserControl控件
学习与使用ASP.NET MVC这样久,还是对asp.net念念不忘.能否在asp.net mvc去显示aspx或是user control呢?这个灵感(算不上灵感,只能算是想法)是来自前些天有写过一 ...
- ASP.NET MVC 学习7、为Model Class的字段添加验证属性(validation attribuate)
Adding Validation to the Model ,在Model中添加数据验证 参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-star ...
随机推荐
- Javascript基础恶补
1.字符集:Javascript采用Unicode字符集,支持地球上所有在用的语言. 2.区分大小写:Javascript区分大小写,HTML不区分大小写. 3.空格.换行.格式控制符:Javascr ...
- 了解 JavaScript (6)– 广告条(Banner)
在 Web 上冲浪时,常常会见到定期在图像之间切换的广告条.我们可以用 JavaScript 来实现,重复循环显示它们. 创建循环的广告条 RotatingBanner.html 页面中在循环的广告条 ...
- Logstash——multiline 插件,匹配多行日志
本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...
- ASP.NET MVC路由规则
1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...
- awk语法
awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理.运行效率高,而且代码简单,对格式化的文本处理能力超强.先来一个例子: 文件a,统计 ...
- 水晶报表设置FiledObject支持HTML格式的数据
经常遇见把数据拼接成html格式后,然后在水晶报表中按照这种格式进行展现. 这就需要我们对次FiledObject设置成html文本: 设置方式: 格式编辑器->段落->文本解释,然后选择 ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
- Python strange questions list
sys.setrecursionlimit(1<<64) Line 3: OverflowError: Python int too large to convert to C long ...
- 解决删除域用户Exception from HRESULT: 0x80072030
解决删除域用户异常问题. System.DirectoryServices.DirectoryServicesCOMException was unhandled Message=在服务器上没有这样 ...
- C#多线程管理代码
/// <summary> /// 多线程执行 /// </summary> public class MultiThreadingWorker { /// <summa ...