iT邦幫忙

DAY 24
1

在錯誤中學習ASP.NET MVC系列 第 24

認識Model - 使用MetaData設定欄位資訊與驗證

  • 分享至 

  • xImage
  •  

了解模型的產生,以及透過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;
        }
}

上一篇
認識Model - Database First 與 .edmx檔
下一篇
認識Model - 自訂欄位驗證
系列文
在錯誤中學習ASP.NET MVC30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言