逐步解說:使用 ASP.NET 應用程式中的網域服務
ASP.NET 提供可由資料繫結控制項 (如 GridView) 使用的 DomainSourceControl 控制項,存取資料庫並讓使用者能夠執行建立、讀取、更新和刪除 (CRUD) 作業。
請注意,網域服務可讓您中斷應用程式與特定資料庫模型的連結,其帶來的優點是將焦點放在商務邏輯,以及建立可容易移植至其他模型的程式碼。
WCF RIA Services 網域服務提供一種模式,供您撰寫在伺服器上執行的應用程式邏輯,並控制存取用於查詢、變更和自動作業的資料。它也透過整合 Silverlight 用戶端與 ASP.NET 伺服器應用程式,提供一般工作 (例如資料驗證、驗證和角色) 的端對端支援。
本逐步解說將說明如何使用 RIA Services 網域服務從 ASP.NET 網頁存取資料庫。雖然本逐步解說所述的是 ASP.NET 中的網域服務,但服務的使用並不限於 ASP.NET 應用程式。本逐步解說不處理 ASP.NET 伺服器與 Silverlight 用戶端應用程式的整合。
本逐步解說包含下列程序:
建立 ASP.NET Web 應用程式
使用網域服務
測試網域服務
必要條件
除了 WCF RIA Services 和 WCF RIA Services 工具組之外,在 RIA Services 文件中呈現的這個逐步解說和其他逐步解說還需要正確安裝並設定數個必要程式 (例如 Visual Studio 2010 和 Silverlight 開發人員執行階段與 SDK)。要執行逐步解說還需要安裝並設定 SQL Server 2008 R2 Express with Advanced Services,以及安裝 AdventureWorks OLTP 和 LT 資料庫。
在 WCF RIA Services 的必要條件節點中的主題也提供符合這些必要條件的詳細指示。請先按照該處提供的指示進行,然後再進行本逐步解說,以確保您在進行本 RIA Services 逐步解說時,盡可能碰到較少的問題。
建立 ASP.NET Web 應用程式
若要使用網域服務,您必須建立能夠處理與資料庫互動的 ASP.NET Web 應用程式。執行步驟如下:
建立 Web 應用程式,以便提供網域服務的使用環境。
加入資料庫至應用程式,以便為 Web 應用程式選擇資料庫。
建立資料庫模型。您要建立包含做為 CLR 型別之資料庫實體的模型。這些型別是網域服務用來與資料庫互動的型別。您可以使用 ADO.NET Entity Framework 或 LINQ to SQL 資料模型。
下列程序將說明如何建立 ASP.NET Web 應用程式。
若要建立 ASP.NET Web 應用程式
在 Visual Studio 2010 中,依序按一下 [檔案] 功能表、[新增] 和 [專案]。
[新增專案] 對話方塊隨即出現。
在 [已安裝的範本] 底下,展開 [Visual C#] 或 [Visual Basic],然後選取 [Web]。
在範本清單中,選取 [ASP.NET 空白 Web 應用程式]。
將專案命名為 UsingDomainService,然後指定位置,再按一下 [確定]。
建置應用程式。
下列程序將說明如何加入資料庫至應用程式。這個資料庫包含資料表,而稍後會加以存取以進行顯示與編輯。
將資料庫加入 Web 應用程式
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後依序按一下 [加入]、[加入 ASP.NET 資料夾] 和 [App_Data]。
隨即會將 [App_Data] 資料夾加入專案中。
以滑鼠右鍵按一下 [App_Data] 資料夾,然後按一下 [加入],再按一下 [現有項目]。
[加入現有項目] 對話方塊隨即出現。
指定 AdventureWorksLT 資料庫檔案 (AdventureWorksLT_Data.mdf) 的位置。
下圖顯示 [加入現有項目] 對話方塊。
按一下 [加入]。
隨即會在專案中建立資料庫檔案的複本。如需詳細資訊,請參閱 HOW TO:使用 .MDF 檔案連接至 AdventureWorksLT 資料庫。
下列程序將說明如何建立內含代表資料庫資料表之類別的資料模型。在本逐步解說中,您將使用 ADO.NET Entity Framework 資料模型,但可以改用 LINQ to SQL 資料模型。
若要建立資料模型
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後按一下 [加入],再按一下 [新增項目]。
[加入新項目] 對話方塊隨即出現。
在 [已安裝的範本] 底下,選取 [資料]。
在範本清單中,選取 [ADO.NET 實體資料模型]。
將資料庫模型命名為 AdventureWorksLT.edmx,然後按一下 [加入]。
[實體資料模型精靈] 隨即顯示。
在 [選擇模型內容] 畫面上,選取 [從資料庫產生]。
下圖顯示 [選擇模型內容] 對話方塊。
按 [下一步]。
在 [選擇您的資料連接] 畫面上的 [您的應用程式應使用哪個資料連接來連接到資料庫?] 底下,從下拉式清單中選取 AdventureWorksLT_Data.mdf。
確定已選取 [另存 Web.Config 中的實體連接字串為:] 核取方塊。您可以保留預設的連接字串名稱。
下圖顯示 [選擇您的資料連接] 對話方塊。
按 [下一步]。
精靈會顯示一個頁面,您可以在此指定要將哪些資料庫物件加入到模型。
在 [選擇您的資料庫物件] 畫面上,選取 [資料表] 節點以從資料庫中選取所有節點。
下圖顯示 [選擇您的資料庫物件] 對話方塊。
確定已選取 [在模型中包含外部索引鍵資料行] 核取方塊。您可以保留預設的模型命名空間。
按一下 [完成]。
隨即會顯示 [ADO.NET 實體資料模型設計工具]。您已經建立了代表 AdventureWorksLT 資料庫的資料模型。
關閉設計工具。
建置應用程式。
建置作業會使 AdventureWorksLT_DataEntities 內容類別可供下一個程序中的網域服務使用。
使用網域服務
這個程序將說明在 ASP.NET 應用程式中使用網域服務所需執行的步驟。這些步驟包括:
在專案中加入 DomainService 類別。這樣會建立類別,可讓您的應用程式執行 CRUD 資料庫作業,以及很重要的是可讓您包含商務邏輯。這個類別會在伺服器或中介層進行作業。
建立商務邏輯。您要在 DomainService 類別中包含程式碼 (商務邏輯)。
宣告 DomainDataSource 控制項。在頁面標記中執行此動作,讓使用者可以與資料庫互動。這個控制項會在用戶端或展示層進行作業。
下列程序將說明如何在專案中加入網域資料服務。
若要在專案中加入 DomainService 類別
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後按一下 [加入],再按一下 [新增項目]。
在 [已安裝的範本] 底下,選取 [Web]。
在範本清單中,選取 [DomainService 類別]。
將檔案命名為 AdventureWorksDomainService.cs 或 AdventureWorksDomainService.vb,然後按一下 [加入]。
[加入新的 DomainService 類別] 對話方塊隨即出現。[DomainService 類別名稱:] 方塊包含指定的名稱。
選取 [啟用用戶端存取] 核取方塊。
在 [可用的 DataContext/ObjectContext 類別:] 下拉式清單中,選取 [AdventureWorksLT_DataEntities (Entity Framework)]。如果下拉式清單空白,表示您並未建置應用程式。結束 [加入新的 DomainService 類別] 對話方塊、建置應用程式並重複前面的步驟。
在 [實體] 清單中,選取 [Product] 資料表。
從 [Product] 資料表選取 [啟用編輯] 核取方塊。
選取 [為中繼資料產生關聯的類別] 核取方塊。
下圖顯示 [加入新的 DomainService 類別] 對話方塊。
按一下 [確定]。
隨即會建立
AdventureWorksDomainService
類別及相關的中繼資料檔案。這個類別包含允許資料庫 CRUD 作業的方法。您可以同時修改類別和中繼資料檔案以包含商務邏輯。下一個程序將示範簡單範例。請注意,專案參考已經更新為包含必要的組件,而 Web.config 檔案已經更新為包含所有必要的組態項目。在 [檔案] 功能表上按一下 [全部儲存]。
下列程序將示範如何自訂 AdventureWorksDomainService
類別及相關的中繼資料檔案以包含商務邏輯。自訂非常很簡單,但可讓您對可做的修改有一點了解。
若要建立商務邏輯
在 [方案總管] 中,開啟 AdventureWorksDomainService.cs 或 AdventureWorksDomainService.vb 檔案。
修改
UpdateProduct
方法以包含ListPrice
欄位的驗證邏輯,如下列程式碼所示。同時以目前日期更新ModifiedDate
欄位。public void UpdateProduct(Product currentProduct) { if ((currentProduct.EntityState == EntityState.Detached)) { // Custom logic: set a lower limit for the price. if (currentProduct.ListPrice < 5) throw new ValidationException("The list price must be >= 5."); this.ObjectContext.Products.AttachAsModified(currentProduct, this.ChangeSet.GetOriginal(currentProduct)); // Custom logic: set the date to the current value. currentProduct.ModifiedDate = DateTime.Today; } }
Public Sub UpdateProduct(ByVal currentProduct As Product) If (currentProduct.EntityState = EntityState.Detached) Then ' Custom logic: set a lower limit for the price. If currentProduct.ListPrice < 5 Then Throw New ValidationException("The list price must be >= 5.") End If Me.ObjectContext.Products.AttachAsModified(currentProduct, _ Me.ChangeSet.GetOriginal(currentProduct)) ' Custom logic: set the date to the current value. currentProduct.ModifiedDate = DateTime.Today End If End Sub
當驗證失敗時,會引發例外狀況並傳送錯誤訊息至要顯示給使用者的頁面。
修改
GetProducts
方法以設定 Entity Framework 正常運作的排序邏輯,如下列程式碼所示。public IQueryable<Product> GetProducts() { return this.ObjectContext.Products.OrderBy(p => p.ProductID); }
Public Function GetProducts() As IQueryable(Of Product) Return Me.ObjectContext.Products.OrderBy(Function(p) p.ProductID) End Function
儲存並關閉檔案。
在 [方案總管] 中,開啟 AdventureWorksDomainService.metadata.cs 或 AdventureWorksDomainService.metadata.vb 檔案。
將 Required 屬性加入至
Color
資料欄位實體,如下列程式碼所示:在資料庫允許的範圍內,您會以這個屬性來強制資料欄位不可以是空的。如果使用者輸入空字串,則會發生錯誤。
[Required(AllowEmptyStrings=false, ErrorMessage="Color is required")] public string Color{ get; set; }
<Required(AllowEmptyStrings:=False, ErrorMessage:="Color is required")> _ Public Property Color As String
儲存並關閉中繼資料檔案。
建置應用程式。
下列程序將說明如何在頁面標記中宣告 DomainDataSource 控制項,讓使用者可以與資料庫互動。
若要在頁面中宣告 DomainDataSource 控制項
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後按一下 [加入],再按一下 [新增項目]。
按一下 [已安裝的範本] 底下的 [Web]。
在範本清單中,選取 [Web Form]。
將檔案命名為 Default.aspx,然後按一下 [加入]。
在 [設計] 檢視中開啟 Default.aspx。
從 [工具箱] 的 [一般] 或 [資料] 群組,將 DomainDataSource 控制項加入至頁面。
DomainDataSource 隨即出現,而且 [DomainDataSource 工作] 功能表隨即開啟。
如果這個控制項不在清單中,請按一下 [工具] 功能表,然後按一下 [選擇工具箱項目]。按一下 [選擇工具箱項目] 對話方塊中的 [.NET Framework 元件] 索引標籤,然後選取 [DomainDataSource] 核取方塊,再按一下 [確定]。
按一下 [DomainDataSource 工作] 功能表中的 [設定資料來源]。
[設定資料來源] 精靈隨時顯示。
在 [選擇網域服務] 畫面上,從 [網域服務類型:] 清單選取您所建立的
UsingDomainService.AdventureWorksDomainService
類別。下圖顯示 [選擇網域服務] 畫面。
按 [下一步]。
在 [設定資料存取] 畫面上,選取
IQueryable<Product> GetProducts()
方法。選取 [啟用插入]、[啟用更新] 和 [啟用刪除] 核取方塊。
下圖顯示 [設定資料存取] 畫面。
按一下 [完成]。
從 [工具箱] 的 [資料] 群組將 GridView 控制項加入至頁面。
GridView 隨即出現,而且 [GridView 工作] 功能表隨即開啟。
在 [GridView 工作] 功能表中,從 [選擇資料來源] 清單選取 [DomainDataSource1]。
這是您在前面步驟中所建立之 DomainDataSource 控制項的 ID。
按一下 [GridView 工作] 功能表中的 [編輯資料行]。
[欄位] 對話方塊隨即出現。
取消選取 [自動產生欄位] 核取方塊。
在 [選取的欄位:] 窗格中刪除 [Name]、[Color]、[ListPrice] 和 [ModifiedDate] 以外的所有欄位。
按一下 [確定]。
(選擇性) 在 [GridView 工作] 功能表中選取相關的核取方塊來啟用分頁、排序和選擇。
儲存檔案並切換至 [原始碼] 檢視。
選取 GridView。
在 [屬性] 視窗中,將 DataKeyNames 屬性設為下列所有未顯示之欄位的逗號分隔清單:ProductID, ProductNumber, StandardCost,Size, Weight,ProductCategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, ThumbNailPhotoFileName, rowguid。
DomainDataSource 控制項須有這個清單,才能執行 CRUD 作業。
將 AutoGenerateEditButton 屬性設定為 True,以啟用資料表資料列的編輯與刪除。
在 [原始碼] 檢視中,以下列標記來取代 Columns 項目。
藉由使用自訂範本,這個標記會在回傳期間 Color 和 ListPrice 資料欄位值傳送至伺服器之前啟用這兩個資料欄位值的驗證。它也會建立一個刪除 LinkButton 控制項,在刪除資料列之前詢問使用者權限。
<Columns> <asp:TemplateField> <ItemTemplate> <asp:LinkButton ID="LinkButton1" CommandName="Delete" Text="Delete" ForeColor="#333333" OnClientClick='return confirm("Are you sure you want to delete this row?");'/> </ItemTemplate> </asp:TemplateField> <asp:CommandField ShowSelectButton="True" /> <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> <asp:TemplateField> <HeaderTemplate>Color</HeaderTemplate> <ItemTemplate> <%# Eval("Color") %> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="ColorID" Text='<%# Bind("Color") %>'/> <cc1:DomainValidator ID="DomainValidator2" DataField="Color"/> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField> <HeaderTemplate>ListPrice</HeaderTemplate> <ItemTemplate> <%# Eval("ListPrice")%> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="ListPriceID" Text='<%# Bind("ListPrice") %>'/> <cc1:DomainValidator ID="DomainValidator3" DataField="ListPrice"/> </EditItemTemplate> </asp:TemplateField> <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" /> </Columns>
在 GridView 前面加入下列標記來啟用要顯示驗證錯誤:
<asp:ValidationSummary ID="ValidationSummary1" /> <cc1:DomainValidator ControlToValidate="GridView1"/>
儲存 Default.aspx 檔案。
建置應用程式。
測試網域服務
這個程序將說明如何透過使用 GridView 控制項來測試網域服務功能。這個程序會驗證下列各項:
透過自訂商務邏輯與資料庫互動是否如預期般正常運作。
ASP.NET 會執行使用者對資料庫欄位所做的變更。
ASP.NET 會顯示自訂邏輯所產生的錯誤訊息。
測試網域服務
在 [方案總管] 中,以滑鼠右鍵按一下 Default.aspx 頁面,然後選取 [在瀏覽器中檢視]。
瀏覽器會顯示可顯示 Product 資料表的頁面。
按一下任何資料列上的 [編輯],然後輸入小於 5 的值來修改 ListPrice 資料行。
在同一資料列上,按一下 [更新]。
隨即會出現一個自訂錯誤,說明欄位必須大於或等於 5。
在同一資料列上,為 ListPrice 資料行輸入大於 5 的值。
在同一資料列上,按一下 [更新]。
ASP.NET 會在資料庫中更新 ListPrice 和 ModifiedDate 資料欄位。
按一下任何資料列上的 [編輯],然後輸入空字串來修改 Color 資料行。
在同一資料列上,按一下 [更新]。
ASP.NET 會顯示自訂驗證錯誤。
在同一資料列上,為 Color 資料行輸入非空字串的值。
在同一資料列上,按一下 [更新]。
ASP.NET 會在資料庫中更新 Color 和 ModifiedDate 資料欄位。