当前位置: 移动技术网 > IT编程>开发语言>.net > Mvc model验证总结

Mvc model验证总结

2018年10月18日  | 移动技术网IT编程  | 我要评论

我爱手办网,株组词,房价收入比怎么算

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; }

    }

}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网