麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

asp.net mvc3 數(shù)據(jù)驗(yàn)證(三)—自定義數(shù)據(jù)注解

2019-11-10 19:18:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
前兩節(jié)講的都是asp.net mvc3預(yù)先設(shè)定的數(shù)據(jù)注解,但是系統(tǒng)自由的數(shù)據(jù)注解肯定不適合所有的場(chǎng)合,所以有時(shí)候我們需要自定義數(shù)據(jù)注解。        自定義數(shù)據(jù)注解有兩種,一種是直接寫(xiě)在模型對(duì)象中,這樣做的好處是驗(yàn)證時(shí)只需要關(guān)心一種模型對(duì)象的驗(yàn)證邏輯,缺點(diǎn)也是顯而易見(jiàn)的,那就是不能重用。                                            還有一種是封裝在自定義的數(shù)據(jù)注解中,優(yōu)點(diǎn)是可重用,缺點(diǎn)是需要應(yīng)對(duì)不同類(lèi)型的模型。        現(xiàn)在我們以封裝在自定義數(shù)據(jù)注解中的方法為例看下如何在asp.net mvc3中自定義數(shù)據(jù)注解以及使用。 一、自定義屬性級(jí)別的驗(yàn)證        首先,所有的數(shù)據(jù)注解都應(yīng)繼承于System.ComponentModel.DataAnnotations命名空間中的ValidationAttribute類(lèi)。            重寫(xiě)其PRotected virtual ValidationResult IsValid(object value, ValidationContext validationContext);例如:        我們需要寫(xiě)一個(gè)UserName不能超過(guò)10個(gè)字母的數(shù)據(jù)注解(你可能會(huì)說(shuō)這不是有的StringLength么,好吧,僅以此為例,我真沒(méi)想到其他的需要自定義數(shù)據(jù)注解的好例子)。        (1)新建一個(gè)類(lèi)MaxLengthAttribute,代碼如下:復(fù)制代碼
    public class MyMaxLengthAttribute : ValidationAttribute    {        private readonly int MaxLength;         public MyMaxLengthAttribute(int maxLength)        {            MaxLength = maxLength;        }         protected override ValidationResult IsValid(object value, ValidationContext validationContext)        {            string content = value.ToString();            if (content.Length > MaxLength)            {                return new ValidationResult("輸入的字符太多了!^_^");            }            return ValidationResult.Success;            //return base.IsValid(value, validationContext);        }復(fù)制代碼        第二步就是像正常使用asp.net自帶的數(shù)據(jù)注解一樣使用,如:        
        [Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")]        [Display(Name = "用戶名")]        [MyMaxLengthAttribute(10)]        [Remote("CheckUserName","Account", HttpMethod="POST")]        public string UserName { get; set; }        好了,只需要這樣簡(jiǎn)單的兩步就可以實(shí)現(xiàn)了。

驗(yàn)證結(jié)果:        對(duì)于自定義的數(shù)據(jù)注解由于是繼承于System.ComponentModel.DataAnnotations命名空間中的ValidationAttribute類(lèi),所以它的一些屬性也可以使用,比如ErrorMessage,如:
        [Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")]        [Display(Name = "用戶名")]        [MyMaxLengthAttribute(10,ErrorMessage="{0}字?jǐn)?shù)太多")]        [Remote("CheckUserName","Account", HttpMethod="POST")]        public string UserName { get; set; }        需要注意的是,自定義的數(shù)據(jù)注解不支持客戶端驗(yàn)證,所有的數(shù)據(jù)需要提交之后再服務(wù)端驗(yàn)證,所以如果要同時(shí)實(shí)現(xiàn)客戶端驗(yàn)證需要自己寫(xiě)js驗(yàn)證。 但是這樣的驗(yàn)證有一個(gè)問(wèn)題,就是默認(rèn)的驗(yàn)證信息不能實(shí)現(xiàn)直接顯示Display Name,所以需要如下更改:復(fù)制代碼
    public class MyMaxLengthAttribute : ValidationAttribute    {        private readonly int MaxLength;         public MyMaxLengthAttribute(int maxLength ):base("{0}的字符太多了!")        {            MaxLength = maxLength;        }         protected override ValidationResult IsValid(object value, ValidationContext validationContext)        {            string content = value.ToString();            if (content.Length > MaxLength)            {                //return new ValidationResult("輸入的字符太多了!^_^");                string errorMessage = FormatErrorMessage(validationContext.DisplayName);                 return new ValidationResult(errorMessage);            }            return ValidationResult.Success;            //return base.IsValid(value, validationContext);        }    }復(fù)制代碼  驗(yàn)證結(jié)果:

 二、自定義Model級(jí)別的驗(yàn)證(IValidatableObject)        這個(gè)接口是為了實(shí)現(xiàn)Model的自驗(yàn)證(self-validating)的,是asp.net mvc3 新增的驗(yàn)證特性。這個(gè)特性和普通數(shù)據(jù)注解的區(qū)別是普通數(shù)據(jù)注解僅僅只能驗(yàn)證Model的一個(gè)屬性,而實(shí)現(xiàn)了IValidatableObject接口的自驗(yàn)證則在Model的級(jí)別來(lái)驗(yàn)證,比如驗(yàn)證Model的幾個(gè)屬性之間的關(guān)系等。        例如,我要驗(yàn)證兩次輸入的密碼相同(好吧,我又把系統(tǒng)自帶的驗(yàn)證再寫(xiě)一遍)。        (1)首先,要將需要驗(yàn)證的Model實(shí)現(xiàn)IValidatableObject接口。     public class RegisterModel : IValidatableObject        (2)在Model中實(shí)現(xiàn)Validate方法:復(fù)制代碼
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContent)        {            if (PassWord != ConfirmPassword)            {                yield return new ValidationResult("兩次輸入的密碼不同!", new[] { "Password" });            }        }復(fù)制代碼

 

        這個(gè)方法在提交Model時(shí)會(huì)自動(dòng)驗(yàn)證兩次輸入的密碼是否相同,如果不同則會(huì)提示,如下:

 注意:1、自驗(yàn)證只能把方法寫(xiě)在需要驗(yàn)證的Model中,所以這種自驗(yàn)證的代碼無(wú)法重用;            2、自驗(yàn)證的返回值是IEnumerable<ValidationResult>,而不是ValidationResult,所以返回值可以不止一個(gè)驗(yàn)證錯(cuò)誤。            3、Validate方法沒(méi)有傳入value參數(shù),也就是意味著Validate方法可以直接訪問(wèn)Model中的屬性值。            4、返回值使用的是yield return來(lái)構(gòu)建枚舉返回值,第二個(gè)參數(shù)是指定錯(cuò)誤信息綁定的屬性,因?yàn)槭莝tring數(shù)組,所以可以關(guān)聯(lián)多個(gè)屬性。

最后附上常用正則表達(dá)式

數(shù)字:"^[0-9]*$"。

n位的數(shù)字:"^/d{n}$"。

至少n位的數(shù)字:"^/d{n,}$"。

m~n位的數(shù)字:。"^/d{m,n}$"

零和非零開(kāi)頭的數(shù)字:"^(0|[1-9][0-9]*)$"。

有兩位小數(shù)的正實(shí)數(shù):"^[0-9]+(.[0-9]{2})?$"。

有1~3位小數(shù)的正實(shí)數(shù):"^[0-9]+(.[0-9]{1,3})?$"。

非零的正整數(shù):"^/+?[1-9][0-9]*$"。

非零的負(fù)整數(shù):"^/-[1-9][]0-9"*$。

長(zhǎng)度為3的字符:"^.{3}$"。

由26個(gè)英文字母組成的字符串:"^[A-Za-z]+$"。

由26個(gè)大寫(xiě)英文字母組成的字符串:"^[A-Z]+$"。

由26個(gè)小寫(xiě)英文字母組成的字符串:"^[a-z]+$"。

由數(shù)字和26個(gè)英文字母組成的字符串:"^[A-Za-z0-9]+$"。

由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:"^/w+$"。

驗(yàn)證用戶密碼:"^[a-zA-Z]/w{5,17}$"正確格式為:以字母開(kāi)頭,長(zhǎng)度在6~18之間,只能包含字符、數(shù)字和下劃線。

驗(yàn)證是否含有^%&’,;=?$/"等字符:"[^%&’,;=?$/x22]+"。

只能輸入漢字:"^[/u4e00-/u9fa5]{0,}$"

驗(yàn)證Email地址:"^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$"。

驗(yàn)證InternetURL:"^http://([/w-]+/.)+[/w-]+(/[/w-./?%&=]*)?$"。

驗(yàn)證電話號(hào)碼:"^(/(/d{3,4}-)|/d{3.4}-)?/d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

驗(yàn)證身份證號(hào)(15位或18位數(shù)字):"^/d{15}|/d{18}$"。

驗(yàn)證一年的12個(gè)月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"1"~"12"。

驗(yàn)證一個(gè)月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"和"1"~"31"。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美在线观看视频一区二区 | 免费一级毛片在线播放视频老 | 亚洲av一级毛片特黄大片 | 国产亚洲高清在线精品不卡 | 欧美a一| 午夜人体 | 免费久久久 | www.精品久久 | 欧美精品久久久久久久久久 | 中国美女一级黄色片 | a视频网站 | 国产精品视频在 | 蜜桃网站在线观看 | 337p日本欧洲亚洲大胆精蜜臀 | gogo全球大胆高清人露出91 | 精精国产xxxx视频在线播放7 | 成年免费在线视频 | 九九热播视频 | 视频在线色| 91精品国产一区二区三区四区在线 | 九九热免费观看 | 成人9禁啪啪无遮挡免费 | 欧美视频国产精品 | 黄色av片在线观看 | 91久久久国产精品 | 成人福利在线免费观看 | 爽爽淫人综合网网站 | 婷婷亚洲一区二区三区 | 国产午夜精品一区二区三区四区 | av在线免费观看不卡 | 91成人免费版 | 久久免费精品 | 国产亚洲精彩视频 | 国产精品视频久久久 | 精品国产三级a | 日韩av电影免费看 | 久久91精品久久久久清纯 | 男女羞羞视频在线免费观看 | 久久午夜神器 | 姑娘第四集免费看视频 | 国产亚洲区 |