VS2010的发布带来了许多令人兴奋的新特性,其中WCF RIA Services无疑是一大亮点。本文旨在展示VS2010的一些实用功能,帮助开发者充分利用VS2010中包含的这些特性。通过几个简单的步骤,可以创建一个具有删除、添加、编辑、排序和分页功能的RIA网站,而几乎不需要编写任何代码,一切都是自动化的。
在VS2010 .NET 4.0中,得到了大量的网站模板和Silverlight模板网站来开始项目。本文的目标是帮助使用这些特性,以便在几分钟内创建一个具有正常添加、编辑、排序、分页和删除功能的GridView。所有这些都是现成的代码,这要归功于WCF RIA Services。
要开始,需要安装VS2010的'Ultimate'版本,它包含了几乎所有的功能。VS2010有四个版本:
支持的操作系统包括:
在开始之前,请确保安装了Silverlight 4 SDK。
以下是使用WCF RIA Services创建Web应用程序的步骤。请注意,在完成每个步骤后,需要构建(CTRL+Shift+B)应用程序。
向项目添加三个WCF RIA Services的引用:
转到数据选项卡,选择ADOEntity Data Model。选择数据库和表。例如,创建了一个包含两个字段CustomerID和CustomerName的示例客户表。构建解决方案(CTRL+Shift+B)。
现在需要创建域服务(DomainService.cs)。在Web菜单下,选择'Domain Service Class'。域服务是一个与数据访问层有合同的类。在这个例子中,有Customer作为域类,并且有与Customer相关的服务,如AddCustomer、EditCustomer和DeleteCustomer。构建解决方案(CTRL+Shift+B)。
选择tblCustomer实体,并勾选以启用'编辑'功能。点击确定继续。构建解决方案(CTRL+F5)。这将抛出一个运行时错误。因为启用了分页,需要更新几行代码。
一旦有了数据模型和域服务,需要将这个模型引入视图层。为此,需要拖动DomainDataSource。需要彻底理解这个层次结构。DomainDataSource有助于与域服务通信,域服务因此与数据实体模型通信。如果在工具箱中找不到DomainDataSource控件,那么可以通过DLL在工具箱中引用它。
在继续将DomainDataSource与GridView控件绑定之前,请在空网站的web.config文件的
<pages>
<controls>
<add tagPrefix="asp" namespace="Microsoft.Web.UI.WebControls" assembly="Microsoft.Web.DomainServices.WebControls" />
</controls>
</pages>
构建解决方案(CTRL+F5)。
一旦在设计视图中有了DomainDataSource,需要将这个域控件与域服务绑定。配置数据源,如下所示:
选择域服务类,并将相同的绑定到DomainDatasource控件。这启用了插入、删除和更新功能。
在空网站中拖动GridView,并配置GridView数据源与DomainDataSource控件。选择所有功能,如排序、分页、编辑和删除。这将在GridView中自动化这些功能,而不需要编写任何代码。
现在运行应用程序(CTRl+F5)。这将抛出一个运行时错误。这是因为启用了分页,需要在DomainService1.cs文件中做一些更改。需要转到GetTblCustomer并注释掉这部分代码:
return this.ObjectContext.tblCustomers;
并添加这个:
return this.ObjectContext.tblCustomers.OrderBy(p => p.CustomerID);
这将根据CustomerID获取记录集,并在内部保持页面计数。下面的代码是自动生成的,可以根据需要进行自定义。
public class DomainService1 : LinqToEntitiesDomainService<AdventureEntities>
{
public IQueryable<tblCustomer> GetTblCustomers()
{
// return this.ObjectContext.tblCustomers;
return this.ObjectContext.tblCustomers.OrderBy(p => p.CustomerID);
}
public void InsertTblCustomer(tblCustomer tblCustomer)
{
if ((tblCustomer.EntityState != EntityState.Detached))
{
this.ObjectContext.ObjectStateManager.ChangeObjectState(tblCustomer, EntityState.Added);
}
else
{
this.ObjectContext.tblCustomers.AddObject(tblCustomer);
}
}
}