上節(jié)我們學(xué)習(xí)了Model的數(shù)據(jù)在界面之間的傳遞,但是很多時(shí)候,我們?cè)跀?shù)據(jù)傳遞的時(shí)候?yàn)榱舜_保數(shù)據(jù)的有效性,不得不給Model的相關(guān)屬性做基本的數(shù)據(jù)驗(yàn)證。
本節(jié)我們就學(xué)習(xí)如何使用 System.ComponentModel.DataAnnotations 命名空間中的特性指定對(duì)數(shù)據(jù)模型中的各個(gè)字段的驗(yàn)證。
這些特性用于定義常見的驗(yàn)證模式,例如范圍檢查和必填字段。而 DataAnnotations 特性使 MVC 能夠提供客戶端和服務(wù)器驗(yàn)證檢查,使你無(wú)需進(jìn)行額外的編碼來(lái)控制數(shù)據(jù)的有效。
System.ComponentModel.DataAnnotations 特性可用于實(shí)體數(shù)據(jù)模型 (EDM)、LINQ to SQL 和其他數(shù)據(jù)模型。 還可以創(chuàng)建自定義驗(yàn)證特性。
關(guān)于DataAnnotations請(qǐng)看System.ComponentModel.DataAnnotations概述
創(chuàng)建項(xiàng)目新建名為User的Model類
public class User{ public int ID { get; set; }}
以Create驗(yàn)證為例來(lái)學(xué)習(xí)DataAnnotations 驗(yàn)證。
新建Create方法
//新建 // GET: /User/Create public ActionResult Create() { return View(); }
添加視圖
注意:在添加視圖的時(shí)候,如果強(qiáng)類型視圖找不到Model,建議在重新生成解決方案。
非空驗(yàn)證
public class User{ public int ID { get; set; } [DisplayName("姓名")] [Required(ErrorMessage = "姓名不能為空")] public string Name { get; set; }}
添加視圖直接運(yùn)行
字符長(zhǎng)度驗(yàn)證
public class User{ public int ID { get; set; } [DisplayName("姓名")] [Required(ErrorMessage = "姓名不能為空")] public string Name { get; set; } [DisplayName("密碼")] [StringLength(6, ErrorMessage = "密碼不能超過6個(gè)字符")] public string Password { get; set; }}
添加視圖后直接運(yùn)行
數(shù)字驗(yàn)證
[DisplayName("年齡")] [Range(1, int.MaxValue, ErrorMessage = "請(qǐng)輸入大于等于1的數(shù)")] public int Age { get; set; }
添加視圖直接運(yùn)行
正則表達(dá)式驗(yàn)證
[DisplayName("電子郵件")] [RegularExpression(@"^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$", ErrorMessage = "請(qǐng)輸入正確的Email格式\n示例:abc@123.com")] public string Email { get; set; }
添加視圖后運(yùn)行效果
遠(yuǎn)程服務(wù)端驗(yàn)證
Remote異步請(qǐng)求驗(yàn)證,在[HttpGet]時(shí)獲取指定Controller里面的指定方法驗(yàn)證,此方法必須是[HttpGet]標(biāo)記的,返回類型為Json類型的JavaScript對(duì)象。
Model代碼
[DisplayName("姓名")] [Required(ErrorMessage = "姓名不能為空")] [Remote("GetUser", "User", ErrorMessage = "該姓名已存在")] public string Name { get; set; }
Controller代碼
//HttpGet是必須加的[HttpGet] public ActionResult GetUser(string name) { return Json(name != "aa", JsonRequestBehavior.AllowGet); }
直接添加視圖運(yùn)行
自定義Attbitue驗(yàn)證
Model代碼
[Required][StringLength(15)][LoginUnique]public string Login { get; set; }
Attribute代碼
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class LoginUniqueAttribute : ValidationAttribute { private static readonly string DefaultErrorMessage = "login unique";//MUI.login_unique; public LoginUniqueAttribute() : base(DefaultErrorMessage) { } public override string FormatErrorMessage(string name) { return DefaultErrorMessage; } public override bool IsValid(object value) { return UserService.Check(p=>p.Name==value.ToString()); } }
直接添加視圖運(yùn)行
其實(shí)微軟DataAnnotations驗(yàn)證一直是在VS平臺(tái)上面充分運(yùn)用的,不管是Web程序還是WForm程序甚至是Silverlight程序,都可以使用微軟提高的DataAnnotations驗(yàn)證,可以說(shuō)是無(wú)孔不入啊。不過就這三種程序而言,MVC的驗(yàn)證相對(duì)來(lái)說(shuō)還是比較完善的,簡(jiǎn)單適用。
聯(lián)系客服