消費者入門 Entity Framework 4.0 Database First 和 ASP.NET 4 Web Form - 第 8 部分

By Tom Dykstra

Contoso University 範例 Web 應用程式示範如何使用 Entity Framework 4.0 和 Visual Studio 2010 建立 ASP.NET Web Forms應用程式。 如需教學課程系列的相關資訊,請參閱 系列中的第一個教學課程

使用動態資料功能來格式化和驗證資料

在上一個教學課程中,您已實作預存程式。 本教學課程將說明動態資料功能如何提供下列優點:

  • 欄位會根據其資料類型自動格式化以顯示。
  • 欄位會根據其資料類型自動驗證。
  • 您可以將中繼資料新增至資料模型,以自訂格式和驗證行為。 當您這樣做時,只要在一個位置新增格式和驗證規則,就會使用動態資料控制項來存取欄位時自動套用這些規則。

若要查看運作方式,您將變更用來在現有 Students.aspx 頁面中顯示和編輯欄位的控制項,並將格式設定和驗證中繼資料新增至實體類型的名稱和日期欄位 Student

Image01

使用 DynamicField 和 DynamicControl 控制項

開啟Students.aspx頁面,然後在 控制項中 StudentsGridView ,以下列標記取代NameEnrollment DateTemplateField 元素:

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <EditItemTemplate>
                    <asp:DynamicControl ID="LastNameTextBox" runat="server" DataField="LastName" Mode="Edit" />
                    <asp:DynamicControl ID="FirstNameTextBox" runat="server" DataField="FirstMidName" Mode="Edit" />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

此標記會使用 DynamicControl 控制項取代學生名稱範本欄位中的 TextBoxLabel 控制項,並使用 DynamicField 註冊日期的控制項。 未指定任何格式字串。

ValidationSummary在 控制項之後 StudentsGridView 新增控制項。

<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
        DisplayMode="BulletList" Style="color: Red" />

SearchGridView 控制項中,取代 [ 名稱 ] 和 [ 註冊日期 ] 資料行的 StudentsGridView 標記,如同您在 控制項中所做的一樣,但省略 EditItemTemplate 元素。 控制項 ColumnsSearchGridView 元素現在包含下列標記:

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

開啟 Students.aspx.cs 並新增下列 using 語句:

using ContosoUniversity.DAL;

新增頁面 Init 事件的處理常式:

protected void Page_Init(object sender, EventArgs e)
{
    StudentsGridView.EnableDynamicData(typeof(Student));
    SearchGridView.EnableDynamicData(typeof(Student));
}

此程式碼會指定動態資料會在實體欄位 Student 的這些資料系結控制項中提供格式和驗證。 如果您在執行頁面時收到類似下列範例的錯誤訊息,這通常表示您忘記在 中 Page_Init 呼叫 EnableDynamicData 方法:

Could not determine a MetaTable. A MetaTable could not be determined for the data source 'StudentsEntityDataSource' and one could not be inferred from the request URL.

執行頁面。

Image03

在 [ 註冊日期 ] 資料行中,時間會隨著日期一起顯示,因為屬性類型為 DateTime 。 您稍後會修正此問題。

現在請注意,動態資料會自動提供基本資料驗證。 例如,按一下 [ 編輯],清除日期欄位,按一下 [ 更新],您會看到動態資料會自動將此設為必要欄位,因為資料模型中的值不可為 Null。 頁面會在 欄位後面顯示星號,並在 控制項中 ValidationSummary 顯示錯誤訊息:

Image05

您可以省略 ValidationSummary 控制項,因為您也可以將滑鼠指標停留在星號上方,以查看錯誤訊息:

Image06

動態資料也會驗證 [ 註冊日期 ] 欄位中輸入的資料是否為有效的日期:

Image04

如您所見,這是一般錯誤訊息。 在下一節中,您將瞭解如何自訂訊息以及驗證和格式化規則。

將中繼資料新增至資料模型

一般而言,您想要自訂動態資料所提供的功能。 例如,您可以變更資料的顯示方式,以及錯誤訊息的內容。 您通常也會自訂資料驗證規則,以提供比動態資料根據資料類型自動提供更多的功能。 若要這樣做,您可以建立對應至實體類型的部分類別。

方案總管中,以滑鼠右鍵按一下ContosoUniversity專案,選取 [新增參考],然後將參考新增至 System.ComponentModel.DataAnnotations

Image11

DAL 資料夾中,建立新的類別檔案,將它命名為 Student.cs,並以下列程式碼取代其中範本程式碼。

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace ContosoUniversity.DAL
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    public class StudentMetadata
    {
        [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
        public DateTime EnrollmentDate { get; set; }

        [StringLength(25, ErrorMessage = "First name must be 25 characters or less in length.")]
        [Required(ErrorMessage="First name is required.")]
        public String FirstMidName { get; set; }

        [StringLength(25, ErrorMessage = "Last name must be 25 characters or less in length.")]
        [Required(ErrorMessage = "Last name is required.")]
        public String LastName { get; set; }
    }
}

此程式碼會為 Student 實體建立部分類別。 MetadataType套用至這個部分類別的屬性會識別您用來指定中繼資料的類別。 中繼資料類別可以有任何名稱,但使用機構名稱加上 「Metadata」 是常見的作法。

套用至中繼資料類別中屬性的屬性會指定格式化、驗證、規則和錯誤訊息。 此處顯示的屬性會有下列結果:

  • EnrollmentDate 會在沒有時間) 的情況下顯示為日期 (。
  • 這兩個名稱欄位的長度必須少於 25 個字元,而且會提供自訂錯誤訊息。
  • 這兩個名稱欄位都是必要欄位,而且會提供自訂錯誤訊息。

再次執行 Students.aspx 頁面,您會看到日期現在不會顯示時間:

Image08

編輯資料列,並嘗試清除名稱欄位中的值。 指出欄位錯誤的星號會在您離開欄位後立即出現,再按一下 [ 更新]。 當您按一下 [ 更新] 時,頁面會顯示您指定的錯誤訊息文字。

Image10

嘗試輸入超過 25 個字元的名稱,按一下 [ 更新],而頁面會顯示您指定的錯誤訊息文字。

Image09

現在您已在資料模型中繼資料中設定這些格式和驗證規則,只要您使用 DynamicControlDynamicField 控制項,就會在每個顯示或允許變更這些欄位的頁面上自動套用這些規則。 這可減少您必須撰寫的備援程式碼數量,讓程式設計和測試更容易,並確保整個應用程式的資料格式設定和驗證一致。

相關資訊

這一系列教學課程會以 Entity Framework 來消費者入門。 如需更多資源來協助您瞭解如何使用 Entity Framework,請繼續進行 下一個 Entity Framework 教學課程系列中的第一個 教學課程,或流覽下列網站: