Web Client Software Factory系列(4):数据绑定和ObjectContainerDataSource控件
概述
在Web Client Software Factory系列(3):View-Presenter模式中提到,表示器包含了響應用戶事件邏輯以及一些View的狀態等,在Web Client Software Factory中包含了一個名為ObjectContainerDataSource的數據源控件,它為View-Presenter模式和數據綁定之間提供了橋梁,ObjectContainerDataSource可以簡單的理解為用來包行對象的容器。它的處理過程如下圖所示:
下面我們將通過一個完成的實力來演示如何使用View-Presenter模式和ObjectContainerDataSource控件進行數據綁定。按照上一篇所講的,我們先在Product業務模塊下添加一個NewProduct視圖。
在視圖中添加ObjectContainerDataSource控件
之前請先在工具箱中添加ObjectContainerDataSource控件,位于Microsoft.Practices.Web.UI.WebControls.dll下,拖拽ObjectContainerDataSource控件到NewProduct.aspx頁面上。
接下來要做的就是配置ObjectContainerDataSource了,其實要配置也就是DataObjectTypeName屬性而已,即ObjectContainerDataSource控件要包含的對象的類型。選擇之前我們編寫Product實體類,配置完成后ASPX中代碼如下:
<asp:Content ID="content1" ContentPlaceHolderID="DefaultContent" Runat="Server"> <h1>NewProduct</h1> <pp:ObjectContainerDataSource ID="ObjectContainerDataSource2" runat="server" DataObjectTypeName="WebClientDemo1.Products.ModuleEntities.Product" /> </asp:Content>這里配置DataObjectTypeName屬性時有兩點需要注意:
1.如果實現Insert、Update、Delete操作,所配置的DataObjectTypeName參數所對應的類型要有一個無參的構造函數;
2.如果實現Update、Delete操作,所配置的DataObjectTypeName參數對應的類型要有一個屬性能夠唯一表示該類型的一個實例,其實就是對應數據庫中的主鍵,也支持聯合主鍵,這個不難理解,想想SQL語句就知道了。
添加DetailsView、GridView綁定到ObjectContainerDataSource
在NewProduct.aspx頁面上添加DetailsView、GridView控件,分布指定它們的DataSourceID為ObjectContainerDataSource1,如下圖所示:
設置完成后的代碼如下:
<asp:Content ID="content" ContentPlaceHolderID="DefaultContent" Runat="Server"> <h1>NewProduct</h1> <hr/> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="ObjectContainerDataSource1" Width="400px"> <Columns> <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> <asp:BoundField DataField="Brand" HeaderText="Brand" SortExpression="Brand" /> <asp:CommandField ShowCancelButton="False" ShowDeleteButton="True" /> </Columns> </asp:GridView> <hr/> <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="ObjectContainerDataSource1" DefaultMode="Insert" Height="50px" Width="400px" DataKeyNames="Id"> <Fields> <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> <asp:BoundField DataField="Brand" HeaderText="Brand" SortExpression="Brand" /> <asp:CommandField ButtonType="Button" InsertText=" Add " ShowCancelButton="False" ShowInsertButton="True" /> </Fields> </asp:DetailsView> <pp:ObjectContainerDataSource ID="ObjectContainerDataSource1" runat="server" DataObjectTypeName="WebClientDemo1.Products.ModuleEntities.Product" /> </asp:Content>實現數據的Insert、Update、Delete
為了實現的數據的增刪改,我們需要修改在Web Client Software Factory系列(2):Composite Web應用程序塊寫過的Service,這里為了演示數據就不從數據庫中讀取了,而是保存在Session中。
IProductDataService接口:
public interface IProductDataService { Product GetProductById(string id); List<Product> Products { get;set;} void InsertProduct(Product product); void UpdateProduct(Product product); void DeleteProduct(Product product); } Service實現: public class ProductDataService : IProductDataService { private List<Product> _products; public List<Product> Products { get { _products = HttpContext.Current.Session["products"] as List<Product>; if (_products == null) { _products = new List<Product>(); } return _products; } set { HttpContext.Current.Session["products"] = value; } } public void InsertProduct(Product product) { product.Id = Guid.NewGuid().ToString(); _products = HttpContext.Current.Session["products"] as List<Product>; if (_products == null) { _products = new List<Product>(); } _products.Add(product); HttpContext.Current.Session["products"] = _products; } public void UpdateProduct(Product product) { Product result = FindProduct(Products, product); if (result != null) { result.Name = product.Name; result.Brand = product.Brand; } } public void DeleteProduct(Product product) { Product result = FindProduct(Products, product); if (result != null) { Products.Remove(result); } } private static Product FindProduct(List<Product> products, Product product) { return products.Find(delegate(Product match) { return product.Id == match.Id; }); } }打開視圖INewProduct,編寫如下代碼
public interface INewProduct { List<Product> Products { set;} } 并在NewProduct.aspx.cs中實現View接口 public List<Product> Products { set { this.ObjectContainerDataSource1.DataSource = value; } } 接下來我們要做的就是實現Controller,在Web Client Software Factory系列(2):Composite Web應用程序塊中注冊和使用服務一節中已經講過了,直接給出代碼: public class ProductsController { public ProductsController() { } private IProductDataService _productDataService; [ServiceDependency] public IProductDataService ProductDataService { set { _productDataService = value; } } public List<Product> Products { get { return _productDataService.Products; } set { _productDataService.Products = value; } } public void InsertProduct(Product product) { _productDataService.InsertProduct(product); } public void UpdateProduct(Product product) { _productDataService.UpdateProduct(product); } public void DeleteProduct(Product product) { _productDataService.DeleteProduct(product); } } 實現我們的Presenter,具體的在Web Client Software Factory系列(3):視圖、表示器和控制器中已經講過 public class NewProductPresenter : Presenter<INewProduct> { private ProductsController _controller; public NewProductPresenter([CreateNew] ProductsController controller) { _controller = controller; } public override void OnViewLoaded() { View.Products = _controller.Products; } public override void OnViewInitialized() { } public void OnProductInserted(Product product) { _controller.InsertProduct(product); } public void OnProductUpdated(Product product) { _controller.UpdateProduct(product); } public void OnProductDeleted(Product product) { _controller.DeleteProduct(product); } }最后為ObjectContainerDataSource控件添加相關的事件,并具體的操作交給Presenter:
protected void ObjectContainerDataSource1_Inserted(object sender, ObjectContainerDataSourceStatusEventArgs e) { _presenter.OnProductInserted((Product)e.Instance); } protected void ObjectContainerDataSource1_Updated(object sender, ObjectContainerDataSourceStatusEventArgs e) { _presenter.OnProductUpdated((Product)e.Instance); } protected void ObjectContainerDataSource1_Deleted(object sender, ObjectContainerDataSourceStatusEventArgs e) { _presenter.OnProductDeleted((Product)e.Instance); }這里需要說明的是ObjectContainerDataSourceStatusEventArgs有兩個特別重要的屬性是Instance和AffectedRows,ObjectContainerDataSource控件通過反射創建它所包含對象的類型的實力Instance,AffectedRows是受影響的行數。
運行后如下:
分頁和排序
如果使用ObjectContainerDataSource默認的分頁和排序功能,需要設置如下兩個屬性:
UsingServerPaging="" UsingServerSorting=""并編寫Selecting事件:
protected void CustomersDataSource_Selecting(object sender, ObjectContainerDataSourceSelectingEventArgs e) { _presenter.OnSelecting(e.Arguments.StartRowIndex, e.Arguments.MaximumRows, e.Arguments.SortExpression); }剩下的就到Presenter中處理分頁了:)
結束語
關于Web Client Software Factory中使用View-Presenter模式進行數據綁定和ObjectContainerDataSource控件就到這里了,希望對您有所幫助。
示例代碼下載:/Files/Terrylee/WebClientDemo2.rar
總結
以上是生活随笔為你收集整理的Web Client Software Factory系列(4):数据绑定和ObjectContainerDataSource控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery学习系列8(过滤选择器)
- 下一篇: GDB调试精粹