了解模型的產生,以及透過Scaffold快速建立CURD功能後,我們就可以來看Model欄位資訊與驗證的設定了,在使用MVC4的網際網路應用程式範本中的註冊畫面,可以觀察到有針對欄位輸入的值進行一些判斷,就是透過模型的欄位資訊與驗證設定。
打開Views/Account/Register.cshtml,其中使用到Razor Html Help中的ValidationSummary與LabelFor的顯示資訊是由哪邊來的呢?可以看到此檢視是使用強型別的RegisterModel,代表Contorller會透過ViewData.Model傳資料過來,按F12移至定義
可以看到每個屬性都使用DataAnnotations定義[Display]屬性,其實就是@Html.LabelFor所顯示的內容,另外也有一些驗證屬性的使用,例如設定欄位為必填的[Require]與設定字串長度的[StringLength],且可以自定義ErrorMessage
回到昨天的範例中,我們透過EF產生了User類別,但畫面最上方很明確地告訴我們,此檔案不建議手動修改,因為是透過範本產生的,很可能下是重建時自己加入的code就被蓋掉了
那要怎麼幫模型加入驗證或欄位資訊呢,必須建立同名的partical class並套用MetadataType屬性,MetadataType這行就是將此partical class與entity類別產生關聯,這時候我們再將User類別下的屬性複製到UserMetadata中
觀察一下Scaffold產生的Views/User/Create.cshtml,可以看到第一行使用User模型類別,在下面搭配了@Html.LabelFor和 @Html.ValidationMessageFor,之前在講Razor HTML Helper時有說會針對for結尾的方法再做說明,其中提到的強型別就是要透過第一行的@model來宣告,告訴View要使用某個Model,這樣在使用for結尾的方法時,才能使用自動提示,並且組成LINQ expression 將參數傳入,使用方式:
自訂變數=> 自訂變數.模型屬性
[](http://2.bp.blogspot.com/-i1vGAJM2GJE/VEnGVD4l9mI/AAAAAAAAAz8/VCKTd401Sk0/s1600/24-8.png" style="line-height: 1.6;)
瀏覽User/Create畫面,就可以看到當使用者名稱欄位空白時,按下Create按鈕會出現驗證訊息,是因為Name這個欄位套用了[Require]屬性,並且透過 @Html.ValidationMessageFor(model => model.Name)將錯誤訊息顯示
更多的DataAnnotations可以參考這裡,其中有個驗證屬性常常被遺忘就是CompareAttribute,可以拿來比對兩個欄位,例如密碼與密碼確認是否相同
想當初因為將欄位驗證屬性都寫在EF自動產生的類別檔裡面,然後因為會被蓋掉嘛!所以我們的Team就很使用最陽春的作法,複製entity類別的程式碼,然後另外建立自己的類別檔,如果今天有新增的功能,View就是使用自訂的類別,然後再將資料手動mapping到entity類別,如果Table有50個欄位,就非常想殺人,我好像有遇到40幾個欄位,後然雖然透過autoMapper結果手動mapping的問題,但其實這個問題應該是要透過partial class與MetadataType來擴充就可以了,所以這就是不好好念書的下場XD,以下是特殊示範,請勿輕易嘗試
public class MyUser
{
public int ID { get; set; }
[Required]
[Display(Name = "使用者名稱")]
public string Name { get; set; }
public Nullable<System.DateTime> Create_Date { get; set; }
public User getEntity()
{
User model = new User();
model.ID = this.ID;
model.Name = this.Name;
model.Create_Date = this.Create_Date;
return model;
}
}