前端基于easyui的mvc扩展
背景
由于MVC的前端是基于jquery.validate和jquery.validate.unobtrusive来实现的,但是当我们要使用其他的ui组件且组件本身就带有完整的验证功能的话,那么要让它们配合起来是有些麻烦的,比如:easyui。
介绍
MVC主要提供了一下几个验证特性来支撑前端的验证:
- CustomValidationAttribute:指定一个用于验证目标成员的验证类型和验证方法。
- DataTypeAttribute:指定要与数据字段关联的附加类型的名称。
- RangeAttribute:用于验证数值字段的值是否在指定的范围之内。
- RegularExpressionAttribute:用于验证字符串字段的格式是否与指定的正则表达式相匹配。
- RequiredAttribute:用于验证必需数据字段。
- StringLengthAttribute:用于验证目标字段的字符串长度是否在指定的范围之内。
- CompareAttribute:用于验证目标字段的值是否与另一个字段值一致,在用户注册场景中可以用于确认两次输入密码的一致性。
- RemoteAttribute:提供使用 jQuery 验证插件远程验证程序的特性。
以上大部分来自System.ComponentModel.DataAnnotations.dll,最后2个是来自System.Web.Mvc.dll
而easyui则是基于validatebox可自定义验证规则以及派生出datebox、numberbox、combobox等控件,来实现form表单输入控件的一套完成的验证体系(详情可参考:www.jeasyui.com),easyui的验证代码如下:
<input class="easyui-validatebox validatebox-text" name="Name" required="true" missingmessage="用户名不能为空!" validtype="regular['^\\w+$', '用户名格式不正确!']" value="admin" type="text">
实现
了解了以上的2方提供的验证支持,那么我们就可以将mvc提供的验证解析为支持easyui验证的前端html代码了,根据以上的资料我们可以发现以下几个可直接转换的规则,实现代码大致如下:
var attribute = validationAttrs.FirstOrDefault(attr => attr is RequiredAttribute);
if (attribute != null)
{
tag.AddAttribute("required", "true");
tag.AddAttribute("missingMessage", attribute.ErrorMessage);
} attribute = validationAttrs.FirstOrDefault(attr => !(attr is RequiredAttribute));
if (attribute == null)
return; if (attribute is StringLengthAttribute)
{
var stringLengthAttr = attribute as StringLengthAttribute;
tag.AddAttribute("invalidMessage", stringLengthAttr.ErrorMessage);
tag.AddAttribute("validType", "length[{0}, {1}]", stringLengthAttr.MinimumLength, stringLengthAttr.MaximumLength);
}
else if (attribute is RegularExpressionAttribute)
{
var regularAttr = attribute as RegularExpressionAttribute;
tag.AddAttribute("validType", "regular['{0}', '{1}']", regularAttr.Pattern.Replace("\\", "\\\\"), regularAttr.ErrorMessage);
}
else if (attribute is RangeAttribute)
{
var rangeAttr = attribute as RangeAttribute;
tag.AddAttribute("validType", "range[{0}, {1}, '{2}']", rangeAttr.Minimum, rangeAttr.Maximum, rangeAttr.ErrorMessage);
}
else if (attribute is CompareAttribute)
{
var compareAttr = attribute as CompareAttribute;
tag.AddAttribute("validType", "eq['[name={0}]', '{1}']", compareAttr.OtherProperty, compareAttr.ErrorMessage);
}
以上代码中把RequiredAttribute和其他的验证规则区分开来是因为RequiredAttribute会生成独立的required="true",而其他的验证规则都是公用validType属性的,至于js验证规则内的regular、range、eq的验证规则并不是easyui内部提供的,而是额外进行扩展的,js代码如下:
$.extend($.fn.validatebox.defaults.rules, {
eq: {
validator: function (value, param) {
this.message = param[1];
return value == $(param[0]).val();
}
},
range: {
validator: function (value, param) {
this.message = param[2];
return value >= param[0] && value <= param[1];
}
},
regular: {
validator: function (value, param) {
this.message = param[1];
var reg = new RegExp(param[0]);
return reg.test(value);
}
}
});
有了以上这些生成规则以后,我们就可以通过扩展HtmlHelper<TModel>来实现类似@Html.EditorFor(model => model.Name)这样的调用了,大致代码如下(这里以validatebox为例):
public static MvcHtmlString ValidateText(this HtmlHelper htmlHelper, Expression<Func<TModel, object>> expression)
{
ModelMetadata modelMetadatum = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
PropertyInfo property = typeof(TModel).GetProperty(modelMetadatum.PropertyName); TagBuilder tag = new TagBuilder("input");
ValidationAttribute[] validationAttrs;
if (property.TryGetAttributes(out validationAttrs))
{
//请阅读转换规则代码
}
return MvcHtmlString.Create(tag.ToString());
}
有了以上基础代码之后,我们就可以使用@Html.ValidateText(m => m.Name)来创建基于easyui的验证控件了。
效果
//类:
public class AccountView
{
private string m_Name = null;
[Required(ErrorMessage = "用户名不能为空!")]
[RegularExpression(@"^\w+$", ErrorMessage = "用户名格式不正确!")]
[DisplayName("用户名:")]
public string Name
{
get { return m_Name; }
set { m_Name = value; }
}
} //页面:
@Html.LabelFor(m => m.Name)
@Html.ValidateText(m => m.Name)//生成的内容为顶部easyui html示例代码
正确:
必填提示:
验证失败:
结尾
以上便是今天所有内容了,后面还有其他的扩展功能,敬请期待,谢谢各位!
前端基于easyui的mvc扩展的更多相关文章
- 前端基于easyui的mvc扩展(续)
前端基于easyui的mvc扩展(续) 回顾及遗留问题 上一篇讲解了基于easyui的mvc扩展的基本实现,已经降低了在mvc内使用easyui的难度,但是仍然还有一些问题: 当我们要给生成的控件设置 ...
- 基于easyui的webform扩展(续)
基于easyui的webform扩展(续) 回顾 <前端基于easyui的mvc扩展>.<前端基于easyui的mvc扩展(续)>.<基于easyui的webform扩展 ...
- 基于easyui的webform扩展
基于easyui的webform扩展 回顾 <前端基于easyui的mvc扩展>.<前端基于easyui的mvc扩展(续)>前两篇介绍了mvc内如何基于easyui进行扩展,在 ...
- 基于easyui的验证扩展
基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...
- 基于easyui与MVC的前端界面
1.登录界面: 2.主界面: 下载源码
- 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。
快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...
- 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]
上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...
- EasyUI + Spring MVC + hibernate实现增删改查导入导出
(这是一个故事--) 前言 作为一个JAVA开发工程师,我觉得最基本是需要懂前端.后台以及数据库. 练习的内容很基础,包括:基本增删改查.模糊查询.分页查询.树菜单.上传下载.tab页 主管发我一个已 ...
- 基于存储过程的MVC开源分页控件--LYB.NET.SPPager
摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...
随机推荐
- python解决SyntaxError: Non-ASCII character '\xe6'
出现情况,输入如下一个函数demo: run,报错: SyntaxError: Non-ASCII character '\xe6' in file /Users/XX/PycharmProjects ...
- Python2.x 与 Python3.x 共存
一.Python2.x 安装 说明:我们先安装python2.x,默认C盘安装即可. 链接: https://pan.baidu.com/s/1yfsVNKmeOR-2C0fK0rPh4A 密码: x ...
- web应用 与 http协议
一.web 应用 Web应用程序是一种可以通过Web访问的应用程序,用户只需要有浏览器即可访问应用程序,不需要再安装其他软件. 应用程序有两种模式C/S.B/S.C/S即客户端—服务端程序这类程序一般 ...
- Fiddler手机抓包软件简单使用--将h5效果显示在手机
此文章是博主自己所写,转载请注明出处 一.简介 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据. ...
- Java序列化机制原理
Java序列化就是将一个对象转化为一个二进制表示的字节数组,通过保存或则转移这些二进制数组达到持久化的目的.要实现序列化,需要实现java.io.Serializable接口.反序列化是和序列化相 ...
- 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM
下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/slambook 第二讲:初识SLAM 2.4.2 Hello SLAM(书本P2 ...
- Linux 关机、重启 命令
重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20:3 ...
- leetcode543
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...
- python 爬虫启航
1. 使用excel(简单使用) 数据- 自网站-导入 2.you-get python爬虫入门 1.环境配置 python,request,lxml 2.原理 爬虫的框架如下: 1.挑选种子URL: ...
- mvc中view与controll之间传递参数时,可以使用url进行传递
mvc中view与controller之间传递参数时,可以使用url进行传递,但是在url的地址中需要加上“id=123”这样的东西才行. 具体如代码: window.location.href = ...