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 == 0; 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 > 1 && 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(30)] [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(30)] public string email { get; set; } [display(name = "密码")] [required(errormessage="请输入密码")] [datatype(datatype.password)] [stringlength(16,minimumlength=6)] public string password { get; set; } [datatype(datatype.password)] [display(name = "确认密码")] [system.componentmodel.dataannotations.compare("password")] public string pasaswordconfirm { get; set; } [stringlength(80)] public string passwordhash { get; set; } [stringlength(10)] [display(name = "密码盐")] public string passwordsalt { get; set; } [stringlength(80)] [display(name = "用户名")] public string username { get; set; } [stringlength(2)] [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 = 20000)] public int id { get; set; } [display(order = 15000)] [required(allowemptystrings = false, errormessage = "用户名不能为空")] [stringlength(20, minimumlength = 6, 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(60, minimumlength = 20, 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(10, 100, 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; } } }
上一篇: 关于我的公众号Alitaba119的价值
下一篇: 字符操作普通帮助类