概述

在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控件相关推荐

  1. Web Client Software Factory系列(3):View-Presenter模式

    概述 将一个ASP.NET站点分离为多个独立的模块,一个最大的问题就是与页面相关联的大多数业务逻辑驻留在该页面的源代码文件中,我们几乎做不到将源代码文件分为多个独立的程序集.为了真正创建独立的与站点中 ...

  2. 关注 Web Client Software Factory [Weekly Drop 08]

    微软模式与实践小组将于今年12月中旬发布的Web Client Software Factory是非常值得我们期待的一个项目,它提供了一个Software Factory来指导我们如何使用微软的平台( ...

  3. SCSF 系列:Smart Client Software Factory 与 ObjectBuilder

    [FLYabroad]ObjectBuilder 简介,SCSF 对 ObjectBuilder 的使用和扩展,SCSF 与控制反转(IOC). 上一篇:Smart Client Software F ...

  4. SCSF 系列:Smart Client Software Factory 中的 MVP 模式概述

    Smart Client Software Factory 是一个关注 Smart Client (智能客户端)构建的 UI 层框架,提供了对 MVP 模式的 First Class 支持,不了解 M ...

  5. Smart Client Software Factory 初试

    Smart Client Software Factory 初试 介绍 智能客户端的介绍我就不再这里说明了,大家可以通过Google去发现. 智能客户端软件工厂提供给建筑师和开发商能够快速综合智能客户 ...

  6. Web Service Software Factory 入门

    这次主要是通过一个示例基本介绍Web Service Software Factory各个层次的开发 一.建立模板 文件-新建-项目,选择Web Service Software Factory (A ...

  7. Smart Client Software Factory安装

    首先要安装 Visual Studio 2010 SDK 不然无法安装 Smart Client Software Factory 2010 然后按顺序安装 GAX 2010 http://visua ...

  8. 从XML文件读取数据绑定到列表控件2

    ComponentArt.Web.UI控件绑定所用XML,同时用于DropDownList的绑定,XML如下: <SiteMap>   <item Text="标题一&qu ...

  9. 深入学习SAP UI5框架代码系列之五:SAP UI5控件的实例数据修改和读取逻辑

    这是Jerry 2021年的第6篇文章,也是汪子熙公众号总共第277篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加载机制 ...

最新文章

  1. 李永乐线性代数手写笔记-特征值和特征向量
  2. shell语法简单介绍
  3. 新版“峡谷第一美”妲己尾巴毛发制作分享
  4. 001机器学习深度学习简介
  5. Android 2.3发短信详细流程
  6. JZOJ 1386. 排序
  7. linux下三三维建模软件,SolidWorks是基于()原创的三维实体建模软件。A.UNIXB.WindowsC.LinuxD.Dos...
  8. TCP/IP模型及OSI七层参考模型各层的功能和主要协议
  9. 使用小丸工具箱进行极限视频压缩
  10. C++无法打开库文件/无法打开源文件
  11. 此ca根目录证书不受信任
  12. Kali linux 基础常用指令详解
  13. python亲和性分析_数据挖掘入门系列教程(一)之亲和性分析
  14. mysql基于Java web的电动车销售平台毕业设计源码201524
  15. [29期] 一个乞丐的故事,什么叫职业人?
  16. 联通没有4g显示无服务器,联通4G去哪了?解密“消失”的联通4G信号
  17. 【Qt】问题解决:Unable to create a debugging engine.
  18. 运筹系列16:routing模型之VRP问题
  19. DMS应用性能管理案例分析(一)
  20. 破解百度网盘 -- 使下载速度增加20倍

热门文章

  1. 父组件传递值给子组件(一)
  2. maven使用出现的错误
  3. Prim和Kruskal求最小生成树
  4. Myeclipse编译工程用Weblogic发布的时候jdk版本问题
  5. 56秒看完131年英格兰顶级联赛冠军排行:利物浦时隔30年再夺冠
  6. 如何优雅地测量一只猫的体积?
  7. 一个秒杀系统,居然比八股文还好使!
  8. 互联网寒冬来袭,有一家公司却逆流而上!
  9. B程序员:讲述三年计算机学习辛酸史
  10. 阿里忘禅:蚂蚁集团分布式注册中心建设分享