紀錄在使用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