版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/tiz198183/article/details/78568364
客戶端驗證對用戶向表單中輸入的數據給出一個即時反饋。
服務器驗證,主要是因為來自網絡的信息都是不能信任的。
一、 為驗證注解訂單
1 、驗證注解的使用,自定義錯誤提示消息
數據注解特性定義在 System.ComponentModel.DataAnnotations 中(但有一個特性不在這個命名空間),它提供了服務器端驗證,當模型屬性上使用這些特性時,框架也支持客戶端驗證。在命名空間DataAnnotations中,有4個特性可以用來應對一般驗證場合。
(1)、字符非空,最大長度,值范圍,兩個屬性相同,正則表達式
//字段非空,最大長度160
[Required(ErrorMessage="FirstName不能為空")]
[StringLength(160, ErrorMessage = "FirstName太長了")]
public string FirstName { get; set; }
//正則表達式驗證必須是電子郵件
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}",
ErrorMessage="郵件地址不正確")]
public string Email { get; set; }
//字段非空,數值類型最小值,最大值
[Required]
[Range(typeof(decimal), "0.00", "49.99")]
public decimal Total { get; set; }
//對象兩個屬性擁有相同的值
[Compare("Email")]
public string EmailConfirm { get; set; }
(2)、命名空間 System.Web.Mvc 中 Remote驗證,可以利用服務器的回調函數執行客戶端的驗證邏輯。
//Remote特性把Username的值發送到服務器,然后在服務器端的數據庫中與相應的表字段值進行比較
[Remote("CheckUserName","Account")]
//返回一個封裝在JSON對象中的布爾類型值(true或false)
public JsonResult CheckUserName(string username)
{
var result = Membership.FindUsersByName(username).Count == 0;
return Json(result, JsonRequestBehavior.AllowGet);
}
2 、本地化
如果應用程序是向國際市場開發的,那么就要為不同的地區顯示不同的文本內容。
幸好,所有驗證特性都允許為本地化的錯誤提示消息指定 資源類型名稱 和 資源名稱。
[Required(ErrorMessageResourceType=typeof(ErrorMessage),
ErrorMessageResourceName="LastNameRequired")]
[StringLength(160,ErrorMessageResourceType=typeof(ErrorMessage),
ErrorMessageResourceName="LastNameTooLong")]
public string LastName { get; set; }
ErrorMessage資源文件中包含的條目(如:LastNameRequired和LastNameTooLong)。
在ASP.NET中,要使用本地化的資源文件,需要將當前線程的UICulture屬性設置為相應的地域語言。
3 、注解的后台原理
(1)、驗證和模型綁定
驗證是什么時候發生的?如何才能知道驗證失敗?
默認情況下,ASP.NET MVC框架在模型綁定時執行驗證邏輯。
A、隱式地執行模型綁定:
[HttpPost]
public ActionResult Create(Album album)
{}
B、顯示地執行模型綁定:利用控制器的UpdateModel或TryUpdateModel方法顯式地執行模型綁定
[HttpPost]
public ActionResult Edit(int id,FormCollection collection)
{
var album=storeDB.Albums.Find(id);
if(TryUpdateModel(album))
{}
}
模型綁定器一旦使用新值完成對模型屬性的更新,就會利用當前的模型元數據獲取模型的所有驗證器。
MVC運行時提供了一個驗證器(DataAnnotationModelValidator)來與數據注釋一同工作。這個模型驗證器會找到所有的驗證特性並執行它們包含的驗證邏輯。模型綁定器捕獲所有失敗的驗證規則並把它們放入模型狀態中。
(2)驗證和模型狀態
模型狀態(利用Controller派生類對象的ModelState屬性可以訪問到)。
模型狀態不僅包含了用戶想放入模型屬性中的所有值,也包括與每個屬性相關聯的所有錯誤。
如果在模型狀態中存在錯誤,ModelState.IsValid就返回false
例如:顧客沒填寫LastName值的情況下,提交表單。由於設置了Required驗證注解特性,因此在模型綁定之后:
ModelState.IsValid==false
ModelState.IsValidField("LastName")==false
ModelState["LastName"].Errors.Count>0
可在模型狀態中查看與失敗驗證相關的錯誤提示消息:
var lastNameErrorMessage=ModelState["LastName"].Errors[0].ErrorMessage;
例如:ValiadationMessage輔助方法可以通過查看模型狀態來顯示與特定部分視圖數據相關的錯誤提示消息:
@Html.ValidationMessageFor(m=>m.LastName)
4 、控制器操作和驗證錯誤
控制器操作決定了在模型驗證失敗或驗證成功時的執行流程。
驗證成功時,操作通常會執行必要的步驟保存或更新客戶信息。
驗證失敗時,操作一般會重新渲染提交模型的視圖,這樣就可以讓用戶看到所有的驗證錯誤提示信息。
二、 自定義驗證邏輯
1 、自定義注解
示例:姓氏中單詞的數量不得超過10個,並且要讓這種驗證在其他模型中重用。
public class MaxWordsAttribute:ValidationAttribute
{
//向構造函數中傳遞一個默認的錯誤提示消息,包含一個參數占位符{0}
public MaxWordsAttribute(int maxWords):base("{0}字符太多")
{
_maxWords = maxWords;
}
//第一個參數是驗證對象的值
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
var valueAsString = value.ToString();
if(valueAsString.Split(' ').Length>_maxWords)
{
//FormatErrorMessage方法會自動使用顯示的屬性名稱來格式化這個字符串
var errorMessage = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success;
}
private readonly int _maxWords;
}
使用方法:
[Required]
[MaxWords(10)]
public string LastName {get;set;}
甚至可以賦予特性自定義的錯誤提示消息:
[Required]
[MaxWords(10,ErrorMessage="字符長度最大為{0}")]
public string LastName {get;set;}
2、 IValidatableObject
模型對象通過實現IValidatableObject接口來實現對自身的驗證。
public class Order:IValidatableObject
{
public int OrderId { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(LastName!=null && LastName.Split(' ').Length>10)
{
yield return new ValidationResult("LastName太長!",new []{"LastName"});
}
}
}
三、 顯示和編輯注解
1、 Display
[Required]
[Display(Name="姓名")]
public string LastName { get; set; }
2、 ScaffoldColumn
3、 DisplayFormat
顯示的格式化
4 、ReadOnly
5 、DataType
6 、UIHint
7 、HiddenInput
四、 小結
————————————————
版權聲明:本文為CSDN博主「tiz198183」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/litao2/article/details/78568364