欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mvc model验证总结

程序员文章站 2022-04-15 10:49:49
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、服务端 ......

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项目模板自带的登录模型类如下:

Mvc model验证总结
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; }

}
Mvc model验证总结


对比普通的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如下:

Mvc model验证总结
[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);
}
Mvc 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、实例一:

    

Mvc model验证总结
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; } } }
Mvc model验证总结

2 、实例二:

Mvc model验证总结
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; }

    }

}