Mvc model验证总结
Model 验证总结
Model 验证总结 1
一.Model 验证标记 1
1、启用客户端验证: 1
2、在 Model 中加入验证标记 2
3 、 Model 类中可以添加的验证标记: 3
3.1、必填字段 3
3.2 、 字段长度 3
3.3 、 正则验证 3
3.4、范围 4
3.5、服务端参与的验证 4
3.6、比较 4
3.7、自定义错误消息 5
4、后台 Action 的写法 6
5 、 最后附上常用正则表达式(网上找的) 7
二、 Model 验证标记实例: 9
1 、 实例一: 9
2 、实例二: 10
附录: 13
一.Model 验证标记
1、启用客户端验证:
客户端验证主要是为了提高用户体验,在网页不回刷的情况下完成验证。
第一步是要在web.config里启用客户端验证,这在MVC3自带的模板项目中已经有了:
|
<addkey="ClientValidationEnabled"value="true"/> <addkey="UnobtrusiveJavaScriptEnabled"value="true"/> |
然后在被验证的View页面上要加入这样两个JavaScript,注意,他们是依赖于JQuery的:
|
<scriptsrc="@Url.Content("~/Scripts/jquery.validate.min.js")"type="text/javascript"></script> <scriptsrc="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"type="text/javascript"></script> |
验证消息的显示有两种,一种是ValidationSummary,它可以显示一份验证消息的汇总,包括从后台Action里返回的消息。
|
@Html.ValidationSummary(true,"Login was unsuccessful. Please correct the errors and try again.") |
另一种是Model中各属性对应HTML控件的验证消息:
|
@Html.ValidationMessageFor(m => m.UserName) |
2、在 Model 中加入验证标记
MVC3项目模板自带的登录模型类如下:
publicclassLogOnModel
{ [Required] [Display(Name ="User name")] publicstringUserName {get;set; } [Required] [DataType(DataType.Password)] [Display(Name ="Password")] publicstringPassword {get;set; } [Display(Name ="Remember me?")] publicboolRememberMe {get;set; } }
对比普通的C#类,我们发现每个属性上都多了被方括号“[]”包围的标记。其中,[Required]是验证标记的一种,而[Display]、[DataType]则是为了显示对应的HTML控件,这不在本文讨论范围之内。
除了Required,我们还可以在Model中添加其他有用的验证标记。下面是个较完整的列表:
3 、 Model 类中可以添加的验证标记:
3.1、必填字段
[Required]
public string FirstName { get; set; }
3.2 、 字段长度
至多n位:
[StringLength(160)]
public string FirstName { get; set; }
要求至少n位:
[StringLength(160, MinimumLength=3)]
public string FirstName { get; set; }
3.3 、 正则验证
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]
public string Email { get; set; }
3.4、范围
[Range(35,44)]
public int Age { get; set; }
小数的情况:
[Range(typeof(decimal), “0.00”, “49.99”)]
public decimal Price { get; set; }
3.5、服务端参与的验证
[Remote(“CheckUserName”, “Account”)]
public string UserName { get; set; }
然后在AccountController里指定一个CheckUserName方法:
publicJsonResult CheckUserName(stringusername)
{
var result = Membership.FindUsersByName(username).Count == ;
returnJson(result, JsonRequestBehavior.AllowGet);
}
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]3.6、比较
public string Email { get; set; }
[Compare(“Email”)]
public string EmailConfirm { get; set; }
3.7、自定义错误消息
正则:
[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”, ErrorMessage=”Email doesn’t look like a valid email address.”)]
public string Email { get; set; }
普通文本:
[Required(ErrorMessage=”Your last name is required”)]
[StringLength(160, ErrorMessage=”Your last name is too long”)]
public string LastName { get; set; }
占位符:
[Required(ErrorMessage=”Your {0} is required.”)]
[StringLength(160, ErrorMessage=”{0} is too long.”)]
public string LastName { get; set; }
4、后台 Action 的写法
Action里要做的有两件事:判断ModelState是否合法、添加错误消息。MVC3模板自带的登录Action如下:
[HttpPost] publicActionResult LogOn(LogOnModel model,stringreturnUrl)
{
if(ModelState.IsValid)
{
if(Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if(Url.IsLocalUrl(returnUrl) && returnUrl.Length > && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
returnRedirect(returnUrl);
}
else
{
returnRedirectToAction("Index","Home");
}
}
else
{
ModelState.AddModelError("","The user name or password provided is incorrect.");
}
} // If we got this far, something failed, redisplay form
returnView(model);
}
if (ModelState.IsValid) 是重点,如果不出意外,即客户端浏览器没有关闭JavaScript,并且客户不是个黑客(黑客可能会通过一些工具模拟POST),那只要通过正常途径 POST到这个Action的Model都应该是IsValid的。当然,编程的一个重要原则是不能相信用户的输入,所以我们有必要再判断一次 ModelState.IsValid。[HttpPost]表示这个Action只能通过POST动作调用,这是为了配合View里的表单,因为FORM的ACTION是POST(当然也可以是GET),不过这不在本文的讨论范围内。
ModelState.AddModelError方法是给View返回一个错误消息,最终交给@Html.ValidationSummary显示。
5 、 最后附上常用正则表达式(网上找的)
数字:"^[0-9]*$"。
n位的数字:"^\d{n}$"。
至少n位的数字:"^\d{n,}$"。
m~n位的数字:。"^\d{m,n}$"
零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
非零的正整数:"^\+?[1-9][0-9]*$"。
非零的负整数:"^\-[1-9][]0-9"*$。
长度为3的字符:"^.{3}$"。
由26个英文字母组成的字符串:"^[A-Za-z]+$"。
由26个大写英文字母组成的字符串:"^[A-Z]+$"。
由26个小写英文字母组成的字符串:"^[a-z]+$"。
由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。
验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&’,;=?$\"等字符:"[^%&’,;=?$\x22]+"。
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
二、Model 验证标记实例:
1、实例一:
public partial class UserDto {
public long ID { get; set; }
[Display(Name="角色编号")]
public long RoleID { get; set; }
[Display(Name="角色")]
public string RoleName { get; set; }
[StringLength()]
[Required(ErrorMessage="登录名不能为空")]
[Display(Name = "登录名")]
[System.Web.Mvc.Remote("CheckUserName", "User","Admin", ErrorMessage = "用户名已存在,请重新填写")]
public string LoginID { get; set; }
[Display(Name = "电话号码")]
[RegularExpression(RegexHelper.Phone,ErrorMessage = "电话格式有误,示例:023-12345678;(023)1234567-1234")]
public string Mobile { get; set; }
[RegularExpression(RegexHelper.Email, ErrorMessage = "请输入正确的Email格式:abc@123.com")]
[Display(Name = "邮箱")]
[StringLength()]
public string Email { get; set; }
[Display(Name = "密码")]
[Required(ErrorMessage="请输入密码")]
[DataType(DataType.Password)]
[StringLength(,MinimumLength=)]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "确认密码")]
[System.ComponentModel.DataAnnotations.Compare("Password")]
public string PasaswordConfirm { get; set; }
[StringLength()]
public string PasswordHash { get; set; }
[StringLength()]
[Display(Name = "密码盐")]
public string PasswordSalt { get; set; }
[StringLength()]
[Display(Name = "用户名")]
public string UserName { get; set; }
[StringLength()]
[Display(Name = "性别")]
public string Gender { get; set; }
[Display(Name = "出生日期")]
[DataType(DataType.Date)]
public DateTime? Birthday { get; set; }
[Display(Name = "操作")]
public string Operation { get; set; }
}
}
2 、实例二:
namespace MvcApplication4.Models
{
public class UserInfo
{ //ID编号
[ScaffoldColumn(false)]
[Required(AllowEmptyStrings = false, ErrorMessage = "用户ID不能为空")]
[Display(Name = "记录编号", Order = )]
public int ID { get; set; }
[Display(Order = )]
[Required(AllowEmptyStrings = false, ErrorMessage = "用户名不能为空")]
[StringLength(, MinimumLength = , ErrorMessage = "用户名不能大于{2} 且要小于{1}")]
[Remote("User", "Validate", HttpMethod = "post", ErrorMessage = "用户名已经存在")]
public string UserName { get; set; }
[Display(Name="password")]
[DataType(DataType.Password)]
[Required(AllowEmptyStrings = false, ErrorMessage = "密码不能为空")]
[StringLength(, MinimumLength = , ErrorMessage = "密码必须在{2} 和{1}之间")]
public string UserPassword { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "邮箱必填")]
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9]+\.[A-Za-z]{2,4}", ErrorMessage = "{0}的格式不正确")]
public string Email { get; set; }
[Compare("Email", ErrorMessage = "邮箱要相同")]
public string TEmail { get; set; } //compare 大小写要相同 否则不会触发 验证
[Display(Name = "身份证号码")]
[RegularExpression(@"\d{17}[\d|x]|\d{15}", ErrorMessage = "身份证号码格式错误")]
public string IdentityNo { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "年龄必填")]
[Range(, , ErrorMessage = "年龄不能大于{2} 不能小于{1}")]
public int Age { get; set; }
[ReadOnly(true)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
[Required(ErrorMessage = "金额不能为空")]
[Range(typeof(decimal), "20.0", "30.0", ErrorMessage = "金额在{1}和{2}之间")]
public decimal Money { get; set; }
}
}
Mvc model验证总结的更多相关文章
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model验证(四)
ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...
- ASP.NET MVC Model验证(三)
ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...
- ASP.NET MVC Model验证(二)
ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...
- ASP.NET MVC Model验证(一)
ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...
- 详解ASP.NET MVC Model验证
ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...
- MVC model验证 获取验证错误信息
public static class ModelStateExtensions { /// <summary> /// 获取model验证错误信息 /// </summary> ...
- 【MVC model 验证失效 】【Unexpected token u in JSON at position 0】【jquery-plugin-validation】
问题描述:mvc model 调用jquery-plugin-validation 实现 前台的数据验证,时报错 Unexpected token u in JSON at position 0 很讨 ...
- MVC Model验证疑难杂症
Q1:有验证但是还是能进入控制器(Controller) 排查之后发现js报错:VM109:1 Uncaught SyntaxError: Unexpected token u in JSON at ...
随机推荐
- iOS-LaunchImage启动页
一. 目标: 设置一个漂亮的启动页. 二.步骤 1. 先创建LaunchImage 2. 进一步设置需要适配的启动页机型 3. 设置完成的效果 4.往里面拖图片,如图是适配的图片的配置 5. 在项目中 ...
- 去百度API的百度地图准确叠加和坐标转换的解决方案研究
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前项目上如果要使用百度地图,得加载百度的开发包,然后通过百 ...
- java删除文件,慎重
在处理删除图片的时候,我将图片路径从数据库取出,然后执行如下删除代码: void deleteFile(File file){ if(file!=null && file.exists ...
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
前言 最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限. 即使在页面 ...
- c# 生成SHA1加密字符串
从网上找到的一种加密代码: var enstr ="abcdefg"; var strRes = Encoding.Default.GetBytes(enstr); HashAlg ...
- 多条asp.net网站的优化建议
一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...
- EF Fluent API上
什么是Fluent API? 官方答案:EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方 ...
- Composer根据Name显示与隐藏
//主要设置 模型的显示与隐藏 private void TransmissionByData_AxSendSelectionChange(string domName, bool isVisible ...
- 绿色简单的学校登录html页面
效果预览:http://hovertree.com/texiao/css/22/ 代码如下: <!DOCTYPE html> <html> <head> <m ...
- 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作
关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...