ASP.NET MVC - Model驗證

紀錄在使用Code First時,如何使用資料驗證屬性確認資料格式是否正確。

資料驗證,是一件繁瑣但相當重要的事情,好在開發Asp.net MVC時,可以直接在Model裡加上屬性就可達到驗證的效果。
Model的驗證有三種效果,分別是數據映射、數據驗證與數據顯示。

數據映射:將在Model定義的規則屬性映射至相對應的資料庫Table
數據驗證:在伺服器或客戶端驗證數據是否有效
數據顯示:在View顯示的數據

命名空間
   System.ComponentModel.DataAnnotations;                
   System.ComponentModel.DataAnnotations.Schema;

DataAnnotations:主要的驗證都包含在此。
DataAnnotations.Schema:映射至資料庫的驗證屬性。

數據映射和驗證屬性

屬性 用途 使用方法 客戶端/伺服器
[Required] 必填欄位 [Required] Y/Y
[MaxLength] 數字或字串的最大長度 [MaxLength(50,ErrorMessage="長度不可超過50")] Y/Y
[MinLength] 數字或字串的最小長度 [MinLength(10,ErrorMessage="長度不可超過50")] Y/Y
[StringLength] 字串長度 [StringLength(50,ErrorMessage="最長50")] Y/Y
[Range] 指定數值範圍 [Range(1,50,ErrorMessage="最少1,最多50")] Y/Y

 

數據驗證屬性

屬性 用途 使用方法 客戶端/伺服器
[Remote] 設定伺服器驗證。 [Remote("Action", "Controller", HttpMethod = "POST", ErrorMessage = "XXX")] N/Y
[FileExtension] 驗證文件擴展名 [FileExtensions(Extensions = "xlsx|xls", ErrorMessage = "請選擇excel檔案")]  
[Compare] 比較兩個屬性的值 [Compare("Password",ErrorMessage="必須與密碼相符")] Y/Y
[RegularExpression] 使用正則表達式驗證   Y/Y
[CustomValidation] 自定義驗證方法   Y/N
[DataType] 定義輸入的型態格式

[DataType(DataType.Date)],指定該欄位輸入格為日期。

Y/N

DataType相關屬性

  • CreditCard
  • Currency
  • Custom
  • Date,[DataType.Date]
  • DateTime,
  • Duration
  • EmailAddress
  • Html
  • ImageUrl
  • MultilineText
  • Password
  • PhoneNumber
  • PostalCode
  • Text
  • Time
  • Upload
  • Url

數據映射屬性

屬性 用途 使用方法
[Key] 主鍵欄位 [Key]
[Column] 資料庫列屬性映射 [Column("ColumnName")]
[NotMapped] 不要創建對應的欄位  
[Table] 映射到資料庫的資料表名稱 [Table("DbTableName")]
[ForeignKey] 外鍵屬性 範例如下

[DatabaseGenerated

(DatabaseGeneratedOption.Computed)]

用在Id(Key值),通常只要設定為Id會自動往上增加,若不想由資料庫自行增加參數可改成DatabaseGeneratedOption.None  
public class Reply
{
    public int ReplyId { get; set;}

    [Foreignkey("TheTopic")]
    public int tid {get ;set ;}
    
    public string Title {get; set;}
    
    public virtual Topic TheTopic { get; set;}


}

#這個方法也是可以
public class Reply
{
    public int ReplyId { get; set; }
 
    public int tid { get; set; }
 
    public string Title { get; set; }
 
    [ForeignKey("tid")]
    public virtual Topic TheTopic { get; set; }
}

 

數據顯示相關的數據註解:

[DisplayName] 指定本地化的字符串(習慣用語類)  
[Display] 指定本地化的字符串(習慣用語屬性)  
[DisplayFormat] 設置數據欄位的格式
 
[DisplayFormat(DataFormatString = “{0:yyyy-MM-dd}”,ApplyFormatInEditMode =true)]
[ReadOnly] 指定該特性所綁定到的屬性是只讀屬性還是讀/寫屬性  
[EditAble] 指示數據欄位是否可編輯  
[HiddenInput] 指示是否應將屬性值或欄位值呈現為隱藏的 input 元素  
[ScaffoldColumn] 指定類或數據列是否使用基架  
[UIHint] 指定動態數據用來顯示數據欄位的模板  

 

其他

[DisplayColumn] 將所引用的表中顯示的列指定為外鍵列
[Description] 可視化設計器在引用組件成員時可以顯示指定的說明

參考資料

https://dotblogs.com.tw/mantou1201/2013/04/18/101814
http://limitedcode.blogspot.tw/2014/07/aspnet-mvc-model-metadata.html
https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application