日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web Client Software Factory系列(4):数据绑定和ObjectContainerDataSource控件

發布時間:2025/3/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。