消費者入門 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
。
使用 DynamicField 和 DynamicControl 控制項
開啟Students.aspx頁面,然後在 控制項中 StudentsGridView
,以下列標記取代Name和Enrollment 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
控制項取代學生名稱範本欄位中的 TextBox
和 Label
控制項,並使用 DynamicField
註冊日期的控制項。 未指定任何格式字串。
ValidationSummary
在 控制項之後 StudentsGridView
新增控制項。
<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
DisplayMode="BulletList" Style="color: Red" />
在 SearchGridView
控制項中,取代 [ 名稱 ] 和 [ 註冊日期 ] 資料行的 StudentsGridView
標記,如同您在 控制項中所做的一樣,但省略 EditItemTemplate
元素。 控制項 Columns
的 SearchGridView
元素現在包含下列標記:
<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.
執行頁面。
在 [ 註冊日期 ] 資料行中,時間會隨著日期一起顯示,因為屬性類型為 DateTime
。 您稍後會修正此問題。
現在請注意,動態資料會自動提供基本資料驗證。 例如,按一下 [ 編輯],清除日期欄位,按一下 [ 更新],您會看到動態資料會自動將此設為必要欄位,因為資料模型中的值不可為 Null。 頁面會在 欄位後面顯示星號,並在 控制項中 ValidationSummary
顯示錯誤訊息:
您可以省略 ValidationSummary
控制項,因為您也可以將滑鼠指標停留在星號上方,以查看錯誤訊息:
動態資料也會驗證 [ 註冊日期 ] 欄位中輸入的資料是否為有效的日期:
如您所見,這是一般錯誤訊息。 在下一節中,您將瞭解如何自訂訊息以及驗證和格式化規則。
將中繼資料新增至資料模型
一般而言,您想要自訂動態資料所提供的功能。 例如,您可以變更資料的顯示方式,以及錯誤訊息的內容。 您通常也會自訂資料驗證規則,以提供比動態資料根據資料類型自動提供更多的功能。 若要這樣做,您可以建立對應至實體類型的部分類別。
在方案總管中,以滑鼠右鍵按一下ContosoUniversity專案,選取 [新增參考],然後將參考新增至 System.ComponentModel.DataAnnotations
。
在 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 頁面,您會看到日期現在不會顯示時間:
編輯資料列,並嘗試清除名稱欄位中的值。 指出欄位錯誤的星號會在您離開欄位後立即出現,再按一下 [ 更新]。 當您按一下 [ 更新] 時,頁面會顯示您指定的錯誤訊息文字。
嘗試輸入超過 25 個字元的名稱,按一下 [ 更新],而頁面會顯示您指定的錯誤訊息文字。
現在您已在資料模型中繼資料中設定這些格式和驗證規則,只要您使用 DynamicControl
或 DynamicField
控制項,就會在每個顯示或允許變更這些欄位的頁面上自動套用這些規則。 這可減少您必須撰寫的備援程式碼數量,讓程式設計和測試更容易,並確保整個應用程式的資料格式設定和驗證一致。
相關資訊
這一系列教學課程會以 Entity Framework 來消費者入門。 如需更多資源來協助您瞭解如何使用 Entity Framework,請繼續進行 下一個 Entity Framework 教學課程系列中的第一個 教學課程,或流覽下列網站:
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應