ASP.NET MVC 3 使用Model自定义验证的样式
1.修改jquery.validate.unobtrusive.js
将onError方法修改
//修改的部分
/////////////////////////////////////////////////////////////////// function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
//add
var $customErrorTip = container.attr("data-forerrortip");
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
//add
var elem = $("#" + inputElement[].name.replace(".", "_"));//添加提示消息
if (replace) {
container.empty();
//add start
if (error.html() != "") {
if ($customErrorTip) {
$("#" + $customErrorTip).poshytip("destroy");
} else {
elem.poshytip("destroy");
}
var direction = "right";
//左边+元素宽+提示的文字+提示两边的空白
if ((elem[].offsetLeft + elem.width() + error.length * + ) > $(document).width()) {
direction = "left";
}
var errorConfig = {
content: error,
alignTo: 'target',
alignX: direction,
alignY: 'center',
showOn: 'none',
bgImageFrameSize: ,
offsetX:
};
if ($customErrorTip) {
$("#" + $customErrorTip).poshytip(errorConfig).poshytip('show');
} else {
elem.filter(':not(.valid)').poshytip(errorConfig).poshytip('show');
}
} else {
if ($customErrorTip) {
$("#" + $customErrorTip).poshytip("destroy");
} else {
elem.poshytip("destroy");
}
}
//add end
//update disable
//error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
} ///////////////////////////////////////////////////////////////////////////////////
2.Index.cshtml页面
@model MvcApplication1.Models.UserViewModel
@{
ViewBag.Title = "Index";
}
<link href="~/Content/poshytip/tip-yellow/tip-yellow.css" rel="stylesheet" />
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Content/poshytip/jquery.poshytip.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script type="text/javascript">
function showTip(objJq, msg) {
objJq.poshytip('destroy');
if (!objJq.data("poshytip")) {
objJq.poshytip({
showOn: 'none',
alignTo: 'target',
alignX: 'right',
alignY: 'center',
offsetX: 5,
className: 'tip-yellow',
content:msg
});
objJq.focus(function () {
$(this).poshytip('hide');
});
objJq.data("poshytip").$tip.click(function () {
$(this).hide();
});
}
objJq.poshytip('show');
}
$(function () {
$("#btnTest").click(function () {
if ($("#myfrom").valid()) {
$.post("@Url.Action("Create","Home")", $("#myfrom").serializeArray(), function (data) {
if (data.Status==3) {
$(data.Msg).each(function () {
var item = $('#' + this.Key);
showTip(item, this.Value);
});
} else {
alert(data);
}
});
}
});
});
</script>
@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { id = "myfrom" }))
{
<label>用户名:</label> @Html.TextBoxFor(u => u.UserName)@Html.ValidationMessageFor(u => u.UserName)
<br />
<label>性别:</label>@*
@Html.RadioButtonFor(u=>u.Sex,1,new{ @checked="checked"})@:男*@
@Html.RadioButtonFor(u=>u.Sex,1)@:男
@Html.RadioButtonFor(u=>u.Sex,2)@:女
<span id="groupRadioErrorSex" style="vertical-align:middle;line-height:70px;"> </span>
@Html.ValidationMessageFor(u => u.Sex,"", new{data_forErrorTip="groupRadioErrorSex" })
<br />
<input type="button" value="提交" id="btnTest" />
}
3.HomeController
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
return View(new UserViewModel() { IsEnable = false, UserCode = "aa" });
} [HttpPost]
public ActionResult Create(UserViewModel model)
{
//移除添加了Request属性,却又不需要验证的属性
ModelState.Remove("UserCode");
ModelState.Remove("UserPwd");
ModelState.Remove("County");
if (!ModelState.IsValid)
{
//服务器端自定义添加错误验证
ModelState.AddModelError("UserName", "您输入的账号已被使用");
return Json(new { Status = , Msg = ModelState.GetErrorsDict() });
}
return Json("ok");
} /// <summary>
/// 远程验证用户名
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public ActionResult GetUser(string username)
{
return Json(!username.ToLower().Equals("admin"),JsonRequestBehavior.AllowGet);//返回True表示通过验证,返回False表示不通过验证
}
} public static class HelperExtensions
{ public static List<KeyValuePair<string, string>> GetErrorsDict(this ModelStateDictionary modelState)
{
var errorList = (from item in modelState
where item.Value.Errors.Any()
select new KeyValuePair<string, string>(item.Key, item.Value.Errors[].ErrorMessage)).ToList(); return errorList;
}
}
4.UserViewModel
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc; namespace MvcApplication1.Models
{
public class UserViewModel
{ /// <summary>
/// Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// FK-用户级别ID
/// </summary>
[Required(AllowEmptyStrings = false, ErrorMessage = "请选择用户等级")]
public int LevelId { get; set; }
/// <summary>
/// 用户类型 详见文档
/// </summary>
public int Type { get; set; }
/// <summary>
/// 用户编号
/// </summary>
[Required()]
public string UserCode { get; set; }
/// <summary>
/// 用户名
/// </summary>
[Required(ErrorMessage = "用户名必需填写")]
[MobileOrEmail(ErrorMessage="输入手机号或邮箱")]
[StringLength(, ErrorMessage = "用户名最大不能超过50个字符")]
[Remote("GetUser", "Home", ErrorMessage = "该姓名已存在")]
public string UserName { get; set; }
/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "密码不能为空")]
public string UserPwd { get; set; }
/// <summary>
/// 确认密码
/// </summary>
public string ConfirmUserPwd { get; set; }
/// <summary>
/// 第三方绑定会员ID
/// </summary>
public string ThirdSiteUserId { get; set; }
/// <summary>
/// 真实姓名
/// </summary>
public string TrueName { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 头像
/// </summary>
public string UserAvatar { get; set; }
/// <summary>
/// 省
/// </summary>
public string Province { get; set; }
/// <summary>
/// 市
/// </summary>
public string City { get; set; }
/// <summary>
/// 区县
/// </summary>
[Required(ErrorMessage="不能为空")]
[System.ComponentModel.DataAnnotations.Compare("City")]
public string County { get; set; }
/// <summary>
/// 地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 邮编
/// </summary>
public string Zip { get; set; }
/// <summary>
/// 电话
/// </summary>
public string Tel { get; set; }
/// <summary>
/// 手机
/// </summary>
[RegularExpression(@"^1[3|4|5|8][0-9]\d{8}$", ErrorMessage = "手机格式错误")]
public string Mobile { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 性别
/// </summary>
[Required(ErrorMessage="请选择性别")]
public string Sex { get; set; }
/// <summary>
/// 出生日期
/// </summary>
public Nullable<System.DateTime> Birthday { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnable { get; set; } public SelectList UserLevelList { get; set; }
public IList<SelectListItem> ProvinceList { get; set; } } /// <summary>
/// 自定义验证属性,手机号或者邮箱
/// </summary>
public class MobileOrEmailAttribute : RegularExpressionAttribute, IClientValidatable
{
public MobileOrEmailAttribute()
: base(RegexHelper.MobileOrEmailPattern) { } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "regex",
ErrorMessage = ErrorMessage,
}; rule.ValidationParameters.Add("pattern", Pattern);
yield return rule;
}
} public static class RegexHelper
{
public static readonly string SlugPattern = @"(^[a-z0-9])([a-z0-9-]+)*([a-z0-9])$";
public static readonly Regex SlugRegex = new Regex(SlugPattern); public static readonly string SlugWithSegmentsPattern = @"^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*$";
public static readonly Regex SlugWithSegmentsRegex = new Regex(SlugWithSegmentsPattern); public static readonly string IpAddressPattern = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
public static readonly Regex IpAddressRegex = new Regex(IpAddressPattern); public static readonly string MobilePattern = @"^1[3|4|5|8][0-9]\d{8}$";
public static readonly Regex MobileRegex = new Regex(MobilePattern); // 密码必需由英文字母、数字或特殊符号组成 6~16个字符,区分大小写
public static readonly string PasswordPattern = @"^[\w~!@#$%^&*()_+|{}:""<>?`\-=\\[\];',./]{6,16}$";
public static readonly Regex PasswordRegex = new Regex(PasswordPattern); public static readonly string EmailPattern = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
public static readonly Regex EmailRegex = new Regex(EmailPattern); public static readonly string UrlPattern = @"^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$";
public static readonly Regex UrlRegex = new Regex(UrlPattern); public static readonly string NumberPattern = @"^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$";
public static readonly Regex NumberRegex = new Regex(NumberPattern); public static readonly string MobileOrEmailPattern = string.Format("({0}|({1}))", MobilePattern, EmailPattern);
}
}
ASP.NET MVC 3 使用Model自定义验证的样式的更多相关文章
- ASP.NET MVC中对Model进行分步验证的解决方法
原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...
- ASP.NET MVC下的四种验证编程方式
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...
- ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
今天我们的项目遇到问题 为了避免跨站点脚本攻击, 默认我们项目是启用了 validateRequest,这也是 ASP.NET 的默认验证规则.项目发布后,如果 customError 启用了,则会显 ...
- ASP.NET MVC下的四种验证编程方式【转】
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...
- ASP.NET MVC下的四种验证编程方式[续篇]
在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...
- ASP.NET MVC下的四种验证编程方式[续篇]【转】
在<ASP.NET MVC下的四种验证编程方式> 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”.“标注ValidationAttribute特性”.“ ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例
在实际的ASP.NET mvc项目开发中,有时会遇到一个参数是一个List.Dictionary等集合类型的情况,默认的情况ASP.NET MVC框架是怎么为我们绑定ASP.NET MVC的Actio ...
- asp.net MVC中的@model与Model
asp.net MVC中的@model与Model https://blog.csdn.net/ydm19891101/article/details/44301201 在MVC的实际使用中,我们经常 ...
随机推荐
- c++ std::string.c_str()
语法: const char *c_str();搜索 c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过 ...
- web图片使用
1. jpg.png.gif 适用场景 jpg 色彩丰富.大的图片例如 写实的图像,商品图片,人像,实物素材的广告banner等 png 色彩较少,有透明,或 具备较大亮度差异及强烈对比的图像,例如 ...
- 高性能的分布式内存对象缓存系统Memcached
Memcached概述 什么是Memcached? 先看看下面几个概念: Memory:内存存储,不言而喻,速度快,对于内存的要求高,不指出的话所缓存的内容非持久化.对于CPU要求很低,所以常常采 ...
- 推迟调用以及Lambda表达式
背景 GMock 我们项目中现在的模块测试框架使用了CATCH+GMock的方式实现回归测试和打桩. GMock的介绍在官网上有,这里为了铺垫,大概地描述一下GMock能实现的效果.大约可以看成这样: ...
- 还原网站上被压缩的JS代码方便阅读
我们经常可以看到一些网站,把所需的javascript代码压缩成一行,就像下图这样: 这种代码浏览器能读懂,但正常人是没法阅读的. 既然浏览器能读,浏览器当然也能还原这段代码. 其实很简单.这里我使用 ...
- "微信全球商业创新大赛-创意中国2015"国际MBA商业挑战赛开启
微信商业化进程一直在摸索中前进,从未间断.近日由中欧国际工商学院与腾讯(Tencent)共同发起举办“微信全球商业创新大赛 - 创意中国2015”(We Win with WeChat - INNOV ...
- Hadoop之伪分布环境搭建
搭建伪分布环境 上传hadoop2.7.0编译后的包并解压到/zzy目录下 mkdir /zzy 解压 tar -zxvf hadoop.2.7.0.tar.gz -C /zzy 配置hado ...
- 入门必看--JavaScript基础
JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...
- 技术分享:WIFI钓鱼的入门姿势
简介 该实验先是搭建一个测试环境,然后创建一个假的无线接入点,把网络连接连接到假的接入点并且强迫用户连接假的无线点. 事先准备 1.无线网卡:无线网卡用于数据包的嗅探和注入. 2. Backtrack ...
- DICOM:DICOM标准学习路线图(初稿)
题记: DICOM医学图像处理专栏撰写已有两个年头,积累了近百篇文章.起初只是用于记录自己科研.工作中遇到的疑难问题,专注于图像处理(主要是医学图像,这也正是专栏名称最初的由来):后来逐渐延伸到了DI ...