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

简介:

概述

Web Client Software Factory系列(3):View-Presenter模式中提到,表示器包含了响应用户事件逻辑以及一些View的状态等,在Web Client Software Factory中包含了一个名为ObjectContainerDataSource的数据源控件,它为View-Presenter模式和数据绑定之间提供了桥梁,ObjectContainerDataSource可以简单的理解为用来包行对象的容器。它的处理过程如下图所示:
TerryLee_WCSF16
下面我们将通过一个完成的实力来演示如何使用View-Presenter模式和ObjectContainerDataSource控件进行数据绑定。按照上一篇所讲的,我们先在Product业务模块下添加一个NewProduct视图。

在视图中添加ObjectContainerDataSource控件

之前请先在工具箱中添加ObjectContainerDataSource控件,位于Microsoft.Practices.Web.UI.WebControls.dll下,拖拽ObjectContainerDataSource控件到NewProduct.aspx页面上。
TerryLee_WCSF17
接下来要做的就是配置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,如下图所示:
TerryLee_WCSF18
设置完成后的代码如下:
<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是受影响的行数。
运行后如下:
TerryLee_WCSF19

分页和排序

如果使用ObjectContainerDataSource默认的分页和排序功能,需要设置如下两个属性:
UsingServerPaging="True"
UsingServerSorting="True" 
并编写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控件就到这里了,希望对您有所帮助。\











本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67727 ,如需转载请自行联系原作者


相关文章
|
9月前
|
缓存 自然语言处理 物联网
LLama Factory+ModelScope实战——使用 Web UI 进行监督微调
LLaMA Factory 是一个高效的大语言模型训练和推理框架,它通过提供一站式的 Web UI 界面和集成多种训练方法,简化了大模型的微调过程,并能够适配多种开源模型。
|
6月前
|
开发者 Java Spring
JSF 牵手社交登录,如魔法风暴席卷 Web 世界,开启震撼便捷登录之旅!
【8月更文挑战第31天】在互联网时代,便捷登录成为用户的核心需求。社交登录凭借其便捷性、安全性和社交化的特点,在各类Web应用中广泛应用。JavaServer Faces(JSF),作为一款流行的Java Web框架,能够轻松集成社交登录功能,显著提升用户体验。本文详细介绍社交登录的优势,并提供两种JSF集成社交登录的常见方法:一是利用Spring Social等第三方库简化开发;二是自行实现社交登录流程。开发者可根据项目需求选择适合的方案。
67 0
|
6月前
|
开发者 C# UED
如何轻松将WinUI控件引入Web应用?Uno Platform实战攻略——从环境搭建到性能优化,一探究竟!
【8月更文挑战第31天】Uno Platform 通过支持 WebAssembly,将 WinUI 控件无缝带入 Web,为多平台开发提供了新途径。本文介绍如何在 Web 中使用 WinUI 控件,包括环境搭建、控件使用、性能优化、样式调整及测试调优,助力开发者打造高质量跨平台应用。
103 0
|
6月前
|
数据采集 前端开发 开发者
Angular表单控件详解:掌握模板驱动与响应式表单的精髓,让Web应用中的数据采集工作变得高效又简单,彻底告别繁琐的表单处理流程
【8月更文挑战第31天】表单是 Web 应用的关键组件,用于用户登录、注册及信息提交。Angular 作为成熟前端框架,提供了强大的表单处理功能,包括模板驱动与响应式表单。本文通过技术博客形式,详细介绍这两种表单控件,并提供示例代码,展示如何利用它们简化表单处理流程,提高开发效率。首先介绍简单的模板驱动表单,然后讲解基于 RxJS 的响应式表单,适用于复杂逻辑。通过本文,你将学会如何高效地使用 Angular 表单控件,提升应用的用户体验。
71 0
|
9月前
|
SQL 存储 Oracle
C# Web控件与数据感应之 Control 类
C# Web控件与数据感应之 Control 类
|
9月前
|
SQL 存储 C#
C# Web控件与数据感应之 TreeView 类
C# Web控件与数据感应之 TreeView 类
|
9月前
|
SQL 存储 Oracle
C# Web控件与数据感应之 CheckBoxList 类
C# Web控件与数据感应之 CheckBoxList 类
|
9月前
|
SQL 存储 Oracle
C# Web控件与数据感应之 ListControl 类
C# Web控件与数据感应之 ListControl 类
|
9月前
|
人工智能 前端开发 Java
软件测试/人工智能|熟练使用web控件定位技巧,提升测试工作效率!
软件测试/人工智能|熟练使用web控件定位技巧,提升测试工作效率!
|
9月前
|
XML C++ 数据格式
C++使用gSoap写Web Server和Web Client
C++使用gSoap写Web Server和Web Client
118 1

热门文章

最新文章