上篇我们介绍了通过CodeSmith模板生成了业务对象库,本篇我们接着介绍怎么使用业务对象库来实现业务应用。
UI层我们通过asp.net来实现,参照一般的应用功能的划分方式,实现以下业务功能:
1. 任务列表
2. 新增任务(同时可新增任务资源)
3.修改任务(同时可管理任务资源)
我们在UI项目中通过两个界面来实现以上3个功能:
1. TaskListForm.aspx (实现功能1,任务列表。在此界面中可以删除任务,也可以导航到新增和修改任务功能)
2. AddTaskForm.aspx (实现功能2,3。)
为了能够使用CSLA的数据绑定控件,我们需要UI项目中添加对Csla.Web.dll引用,同时在VS2010的工具栏中添加Csla.Web的工具选项。
修改Web.Config,在System.Web节中增加以下代码:
View Code
<pages controlRenderingCompatibilityVersion="3.5"clientIDMode="AutoID">
<controls>
<add tagPrefix="csla" namespace="Csla.Web" assembly="Csla.Web"/>
</controls>
</pages>
复制代码
在UI项目增加两个ASPX页面:TaskListForm.aspx和AddTaskForm.aspx
实现 TaskListForm.aspx的步骤:
1. 从工具栏拖入一个GridView控件到页面中,用来显示任务列表信息,将Id更改为:gvTask
2. 从工具栏拖入一个CslaDataSource控件到页面中,用来加载任务列表的数据源,将Id更改为:taskDataSource
3. 从工具栏拖入一个LinkButton控件到页面中,用作为新增任务链接,将Id更改为:lbCreate,将Text设置为:创建任务
4. 从工具栏拖入一个Lable控件到页面中,用作为显示提示信息,将Id更改为:lblMsg,将Text设置为空
5. 将taskDataSource控件的TypeName属性设置为我们要绑定的业务对象列表类型(全名,含程序集名):Demo.Business.TaskList,Demo.Business。
taskDataSource的代码如下:
View Code
<csla:CslaDataSourcerunat="server" ID="taskDataSource"TypeAssemblyName=""
TypeName="Demo.Business.TaskList,Demo.Business"TypeSupportsPaging="False"
TypeSupportsSorting="False"></csla:CslaDataSource>
复制代码
6. 为gvTask选择数据源为taskDataSource,同时启用分页,启用删除,启用选择内容。修改绑定列的标题;变更日期格式为:{0:yyyy-MM-dd}。为了显示效果,可以选择传统型的风格。gvTask的代码如下:
View Code
<asp:GridViewrunat="server" id="gvTask"AllowPaging="True"
AutoGenerateColumns="False"
DataSourceID="taskDataSource"CellPadding="4"ForeColor="#333333"
GridLines="None"onrowdeleted="gvTask_RowDeleted"
DataKeyNames="Identification"
onselectedindexchanged="gvTask_SelectedIndexChanged">
<FooterStyleBackColor="#507CD1" Font-Bold="True"ForeColor="White"/>
<RowStyleBackColor="#EFF3FB"/>
<PagerStyleBackColor="#2461BF"ForeColor="White"HorizontalAlign="Center"/>
<SelectedRowStyleBackColor="#D1DDF1" Font-Bold="True"ForeColor="#333333"/>
<HeaderStyleBackColor="#507CD1" Font-Bold="True"ForeColor="White"/>
<Columns>
<asp:BoundFieldDataField="Identification"HeaderText="任务Id"
InsertVisible="False"ReadOnly="True"SortExpression="Identification"/>
<asp:BoundFieldDataField="TaskName"HeaderText="任务名称"
SortExpression="TaskName"/>
<asp:BoundFieldDataField="PrincipalUser"HeaderText="用户"
SortExpression="PrincipalUser"/>
<asp:BoundFieldDataField="StartSchedule"HeaderText="开始时间"
SortExpression="StartSchedule"DataFormatString="{0:yyyy-MM-dd}"/>
<asp:BoundFieldDataField="ActualFinishTime"HeaderText="实际完成时间"
SortExpression="ActualFinishTime"DataFormatString="{0:yyyy-MM-dd}"/>
<asp:CommandFieldShowSelectButton="True"/>
<asp:CommandFieldShowDeleteButton="True"/>
</Columns>
<EditRowStyleBackColor="#2461BF"/>
<AlternatingRowStyleBackColor="White"/>
</asp:GridView>
复制代码
现在来看看我们的成果,如下图所示:
接下来的步骤主要跟后台代码相关:
7. 为taskDataSource注册事件处理方法
DeleteObject事件处理方法taskDataSource_DeleteObject,用来处理在数据源中删除一条任务信息
SelectObject事件处理方法taskDataSource_SelectObject,用来指定业务对象(任务列表)
后台代码如下:
View Code
1#regiontaskDataSource事件处理方法
2protectedvoidtaskDataSource_DeleteObject(object sender, Csla.Web.DeleteObjectArgs e)
3 {
4decimal key = decimal.Parse(e.Keys["Identification"].ToString());
5try
6 {
7Task.DeleteTask(key);
8e.RowsAffected = 1;
9 }
10catch (Csla.DataPortalException ex)
11 {
12showMessage(ex.BusinessException.Message);
13e.RowsAffected = 0;
14 }
15catch (Exception ex)
16 {
17showMessage( ex.Message);
18e.RowsAffected = 0;
19 }
20 }
21
22protectedvoidtaskDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
23 {
24e.BusinessObject = getTaskList();
25 }
26#endregion
复制代码
8. 为gvTask注册事件处理方法
RowDeleted事件处理方法gvTask_RowDeleted,用来处理当数据源中任务删除后刷新控件绑定
SelectedIndexChanged事件处理方法gvTask_SelectedIndexChanged,用来导航到修改任务功能
后台代码如下:
View Code
1#regiongvTask控件事件处理方法
2protectedvoidgvTask_RowDeleted(object sender, GridViewDeletedEventArgs e)
3 {
4 Session["currentObject"] = null;
5gvTask.DataBind();
6 }
7
8protectedvoidgvTask_SelectedIndexChanged(object sender, EventArgs e)
9 {
10Response.Redirect("AddTaskForm.aspx?id=" + gvTask.SelectedDataKey.Value);
11 }
12
13
14#endregion
复制代码
9. 为lbCreate注册事件处理方法
Click事件处理方法lbCreate_Click,用来导航到新增任务功能
后台代码如下:
View Code
1protectedvoidlbCreate_Click(object sender, EventArgs e)
2 {
3Response.Redirect("AddTaskForm.aspx");
4 }
复制代码
10. 在后台实现以下私有方法:
void showMsg(string msg) 显示提示信息
TaskListgetTaskList() 获取任务列表
void ApplyAuthorizationRules() 应用授权
后台代码如下:
View Code
1#region Private Method
2///<summary>
3///显示消息
4///</summary>
5///<param name="msg"></param>
6privatevoidshowMessage(stringmsg)
7 {
8lblMsg.Text = msg;
9 }
10
11///<summary>
12///获取业务对象集合方法
13///</summary>
14///<returns></returns>
15privateTaskListgetTaskList()
16 {
17objectbusinessObject = Session["currentObject"];
18if (businessObject == null ||
19 !(businessObjectisTaskList))
20 {
21businessObject =
22TaskList.GetAll();
23 Session["currentObject"] = businessObject;
24 }
25return (TaskList)businessObject;
26 }
27
28///<summary>
29///应用授权规则方法
30///</summary>
31privatevoidApplyAuthorizationRules()
32 {
33if (!Csla.ApplicationContext.User.Identity.IsAuthenticated)
34 {
35Response.Redirect("login.aspx");
36 }
37
38 Type objectType = typeof(Task);
39
40this.gvTask.Columns[6].Visible = BusinessRules.HasPermission(AuthorizationActions.DeleteObject, objectType);
41lbCreate.Visible = BusinessRules.HasPermission(AuthorizationActions.CreateObject, objectType);
42 }
43#endregion
复制代码
11. 在页面装载事件处理处理程序中调用授权控制:
View Code
1protectedvoidPage_Load(object sender, EventArgs e)
2 {
3if (!IsPostBack)
4 {
5 Session["currentObject"] = null;
6ApplyAuthorizationRules();
7 }
8else
9 {
10showMessage("");
11 }
12 }
复制代码
现在我们已经完成了功能1,任务列表页面
实现 AddTaskForm.aspx的步骤:
(本页面实现功能2和功能3,通过是否传递Id参数来确定是新增任务还是修改任务)
1. 从工具栏拖入一个DetailsView控件到页面中,用来操作任务信息,将Id更改为:dvTask
2. 从工具栏拖入一个Button控件到页面中,用来进行新增任务资源操作,将Id更改为:btnNew,将Text设置为:新增资源
3. 从工具栏拖入一个GridView控件到页面中,用来操作任务资源列表信息,将Id更改为:gvResources
4. 从工具栏拖入一个Lable控件到页面中,用来显示提示消息,将Id更改为:lblMsg
5. 从工具栏拖入两个CslaDataSource控件到页面中,用来加载任务和任务资源列表数据源,将Id分别更改为:TaskDataSource,TaskResourceListDataSource
TaskDataSource配置数据源为:Demo.Business.Task, Demo.Business
TaskResourceListDataSource配置数据源为:Demo.Business.TaskResourceList, Demo.Business
代码如下:
View Code
<csla:CslaDataSourceID="TaskDataSource"runat="server"
TypeAssemblyName=""
TypeName="Demo.Business.Task, Demo.Business"TypeSupportsPaging="False"
TypeSupportsSorting="False">
</csla:CslaDataSource>
<csla:CslaDataSourceID="TaskResourceListDataSource"runat="server"
TypeAssemblyName=""TypeName="Demo.Business.TaskResourceList, Demo.Business"TypeSupportsPaging="False"
TypeSupportsSorting="False">
</csla:CslaDataSource>
复制代码
6. 从工具栏拖入一个Button控件到页面中,用来进行新增任务资源操作,将Id更改为:btnReturn,将Text设置为:返回列表
7. 为dvTask选择数据源为TaskDataSource,同时启用插入,启用编辑。修改绑定列的标题;变更日期格式为:{0:yyyy-MM-dd}。为了显示效果,可以选择传统型的风格。
为gvResources选择数据源为TaskResourceListDataSource,同时启用编辑,启用删除。修改绑定列的标题;变更TaskId为只读。为了显示效果,可以选择传统型的风格。
代码如下:
View Code
<asp:DetailsViewrunat="server" ID="dvTask"AutoGenerateRows="False"DataSourceID="TaskDataSource"
CellPadding="4"ForeColor="#333333"GridLines="None"
DataKeyNames="Identification">
<Fields>
<asp:BoundFieldDataField="Identification"HeaderText="任务ID"
InsertVisible="False"ReadOnly="True"SortExpression="Identification"/>
<asp:BoundFieldDataField="TaskName"HeaderText="任务名称"
SortExpression="TaskName"/>
<asp:BoundFieldDataField="PrincipalUser"HeaderText="用户"
SortExpression="PrincipalUser"/>
<asp:BoundFieldDataField="StartSchedule"HeaderText="开始时间"
SortExpression="StartSchedule"ApplyFormatInEditMode="True"
DataFormatString="{0:yyyy-MM-dd}"/>
<asp:BoundFieldDataField="ActualFinishTime"HeaderText="实际完成时间"
SortExpression="ActualFinishTime"ApplyFormatInEditMode="True"
DataFormatString="{0:yyyy-MM-dd}"/>
<asp:CommandFieldShowEditButton="True"
ShowInsertButton="True"/>
</Fields>
<FooterStyleBackColor="#5D7B9D" Font-Bold="True"ForeColor="White"/>
<CommandRowStyleBackColor="#E2DED6" Font-Bold="True"/>
<RowStyleBackColor="#F7F6F3"ForeColor="#333333"/>
<FieldHeaderStyleBackColor="#E9ECF1" Font-Bold="True"/>
<PagerStyleBackColor="#284775"ForeColor="White"HorizontalAlign="Center"/>
<HeaderStyleBackColor="#5D7B9D" Font-Bold="True"ForeColor="White"/>
<EditRowStyleBackColor="#999999"/>
<AlternatingRowStyleBackColor="White"ForeColor="#284775"/>
</asp:DetailsView>
<asp:GridViewID="gvResources"runat="server"AutoGenerateColumns="False"
DataSourceID="TaskResourceListDataSource"DataKeyNames="Identification">
<Columns>
<asp:BoundFieldDataField="Identification"HeaderText="资源ID"
ReadOnly="True"SortExpression="Identification"/>
<asp:BoundFieldDataField="TaskId"HeaderText="任务Id"
SortExpression="TaskId"ReadOnly="True"/>
<asp:BoundFieldDataField="ResourceName"HeaderText="资源名称"
SortExpression="ResourceName"/>
<asp:CommandFieldShowDeleteButton="True"ShowEditButton="True"/>
</Columns>
</asp:GridView>
复制代码
至此,界面设计完成,如下图:
接下来实现后台代码:
9. 为TaskDataSource注册事件处理方法
InsertObject事件处理方法TaskDataSource_InsertObject,用来处理在数据源中增加一条任务信息
SelectObject事件处理方法TaskDataSource_SelectObject,用来指定业务对象(任务信息)
TaskDataSource事件处理方法TaskDataSource_UpdateObject,用来处理在数据源中更新一条任务信息
后台代码如下:
View Code
1#regionTaskDataSource事件处理
2///<summary>
3///新增任务处理事件
4///</summary>
5///<param name="sender"></param>
6///<param name="e"></param>
7protectedvoidTaskDataSource_InsertObject(object sender, Csla.Web.InsertObjectArgs e)
8 {
9 Task obj = getTask();
10try
11 {
12Csla.Data.DataMapper.Map(e.Values, obj, "Identification");
13 }
14catch (Exception ex)
15 {
16showMessage(ex.Message);
17
18return;
19 }
20e.RowsAffected = saveTask(obj);
21 }
22
23///<summary>
24///初始事件
25///</summary>
26///<param name="sender"></param>
27///<param name="e"></param>
28protectedvoidTaskDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
29 {
30e.BusinessObject = getTask();
31 }
32
33///<summary>
34///更新任务处理事件
35///</summary>
36///<param name="sender"></param>
37///<param name="e"></param>
38protectedvoidTaskDataSource_UpdateObject(object sender, Csla.Web.UpdateObjectArgs e)
39 {
40 Task obj = getTask();
41Csla.Data.DataMapper.Map(e.Values, obj);
42e.RowsAffected = saveTask(obj);
43 }
44#endregion
复制代码
10.为TaskResourceListDataSource注册事件处理方法
DeleteObject事件处理方法TaskResourceDataSource_DeleteObject,用来处理在数据源中删除一条任务资源信息
SelectObject事件处理方法TaskResourceListDataSource_SelectObject,用来指定业务对象(任务资源信息)
TaskDataSource事件处理方法TaskResourceListDataSource_UpdateObject,用来处理在数据源中更新一条任务资源信息
后台代码如下:
View Code
1#regionTaskResourceDataSource事件处理
2protectedvoidTaskResourceDataSource_DeleteObject(object sender, Csla.Web.DeleteObjectArgs e)
3 {
4 Task task = getTask();
5decimal id = decimal.Parse(e.Keys["Identification"].ToString());
6TaskResourcetrr = task.TaskResources.First(p =>p.Identification == id);
7if (trr != null)
8 {
9task.TaskResources.Remove(trr);
10e.RowsAffected = saveTask(task);
11 }
12
13 }
14
15protectedvoidTaskResourceDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
16 {
17 Task task = getTask();
18e.BusinessObject = task.TaskResources;
19 }
20
21protectedvoidTaskResourceDataSource_UpdateObject(object sender, Csla.Web.UpdateObjectArgs e)
22 {
23 Task task = getTask();
24decimal id = decimal.Parse(e.Keys["Identification"].ToString());
25TaskResourcetrr = task.TaskResources.First(p =>p.Identification == id);
26if (trr != null)
27 {
28DataMapper.Map(e.Values, trr);
29e.RowsAffected = saveTask(task);
30 }
31
32 }
33#endregion
复制代码
11. 为dvTask注册事件处理方法
ItemInserted事件处理方法dvTask_ItemInserted,用来处理当数据源中任务插入完成后的处理
ItemUpdated事件处理方法dvTask_ItemUpdated,用来处理当数据源中任务更新完成后的处理
后台代码如下:
View Code
1#regiondvTask控件事件处理
2
3///<summary>
4///新增条目后事件
5///</summary>
6///<param name="sender"></param>
7///<param name="e"></param>
8protectedvoiddvTask_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
9 {
10 Task obj = getTask();
11if (!obj.IsNew)
12 {
13Response.Redirect("AddTaskForm.aspx?id=" + obj.Identification);
14 }
15
16 }
17
18///<summary>
19///更新记录后事件
20///</summary>
21///<param name="sender"></param>
22///<param name="e"></param>
23protectedvoiddvTask_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
24 {
25ApplyAuthorizationRules();
26 }
27#endregion
复制代码
12. 为btnNew注册事件处理方法
Click事件处理方法btnNew_Click,用来处理新增任务资源
后台代码如下:
View Code
1protectedvoidbtnNew_Click(object sender, EventArgs e)
2 {
3createResource();
4 }
复制代码
13. 为btnReturn注册事件处理方法
Click事件处理方法btnReturn_Click,用来导航到任务列表功能页面
后台代码如下:
View Code
1protectedvoidbtnReturn_Click(object sender, EventArgs e)
2 {
3Response.Redirect("TaskListForm.aspx");
4 }
复制代码
14. 在后台实现以下私有方法:
void showMsg(string msg) 显示提示信息
Task getTask() 获取任务信息
void createResource() 新增任务资源
intsaveTask(Task task) 保存任务信息到数据源
void ApplyAuthorizationRules() 应用授权
后台代码如下:
View Code
1#region Private Method
2///<summary>
3///显示消息
4///</summary>
5///<param name="msg"></param>
6privatevoidshowMessage(stringmsg)
7 {
8lblMsg.Text = msg;
9 }
10
11///<summary>
12///应用授权规则
13///</summary>
14privatevoidApplyAuthorizationRules()
15 {
16 Task obj = getTask();
17// 是否有权限编辑任务
18boolcanEditTask = BusinessRules.HasPermission(AuthorizationActions.CreateObject, obj.GetType());
19
20if (canEditTask)
21 {
22if (obj.IsNew)
23this.dvTask.DefaultMode = DetailsViewMode.Insert;
24else
25this.dvTask.DefaultMode = DetailsViewMode.Edit;
26 }
27else
28 {
29this.dvTask.DefaultMode = DetailsViewMode.ReadOnly;
30 }
31this.dvTask.Rows[
32this.dvTask.Rows.Count - 1].Visible = canEditTask;
33 }
34///<summary>
35///获取业务对象方法
36///</summary>
37///<returns></returns>
38private Task getTask()
39 {
40objectbusinessObject = Session["currentObject"];
41if (businessObject == null ||
42 !(businessObjectis Task))
43 {
44try
45 {
46stringidString = Request.QueryString["id"];
47if (!string.IsNullOrEmpty(idString))
48 {
49decimal id = decimal.Parse(idString);
50businessObject = Task.GetByIdentification(id);
51 }
52else
53 {
54businessObject = Task.NewTask();
55 }
56
57 Session["currentObject"] = businessObject;
58 }
59catch (System.Security.SecurityException se)
60 {
61Response.Redirect("TaskListForm.aspx");
62 }
63
64 }
65return (Task)businessObject;
66 }
67
68///<summary>
69///保存业务对象到持久层
70///</summary>
71///<param name="task"></param>
72///<returns></returns>
73privateintsaveTask(Task task)
74 {
75introwsAffected;
76try
77 {
78 Session["currentObject"] = task.Save();
79rowsAffected = 1;
80 }
81catch (ValidationException ex)
82 {
83System.Text.StringBuilder message = newSystem.Text.StringBuilder();
84message.AppendFormat("{0}", ex.Message);
85if (task.BrokenRulesCollection.Count>0)
86 {
87message.Append("<ul>");
88foreach (BrokenRule rule intask.BrokenRulesCollection)
89message.AppendFormat("<li>{0}: {1}</li>", rule.Property, rule.Description);
90message.Append("</ul>");
91 }
92showMessage(message.ToString());
93rowsAffected = 0;
94 }
95catch (Csla.DataPortalException ex)
96 {
97showMessage(ex.BusinessException.Message);
98rowsAffected = 0;
99 }
100catch (Exception ex)
101 {
102showMessage(ex.Message);
103rowsAffected = 0;
104throw ex;
105 }
106returnrowsAffected;
107 }
108
109///<summary>
110///新增任务资源
111///</summary>
112privatevoidcreateResource()
113 {
114 Task task = getTask();
115TaskResourcetrr = task.TaskResources.AddNew();
116this.gvResources.DataBind();
117 }
118
119#endregion
复制代码
15. 在页面装载事件处理处理程序中调用授权控制:
View Code
1protectedvoidPage_Load(object sender, EventArgs e)
2 {
3if (!IsPostBack)
4 {
5 Session["currentObject"] = null;
6ApplyAuthorizationRules();
7 }
8else
9 {
10
11
12showMessage("");
13 }
14 }
复制代码
至止,我们完成了功能2和功能3的页面:AddTaskForm.aspx
最后,我们在Default.aspx页面加上任务列表和新增任务的导航,代码如下:
View Code
<div>
<a href="TaskListForm.aspx">任务列表</a> | <a href="AddTaskForm.aspx">创建新任务</a>
</div>
复制代码
现在,我们已经完成整个demo的应用构建,开发过程非常简单快捷,demo源代码可在此处下载。在前面的介绍中,并没有对CSLA本身的特性进行介绍,只是简单介绍如何利用CSLA框架快速生成并实现应用,从下一篇开始,将会从CSLA的不同特性分别进行介绍,希望能够对大家应用CSLA开发有所帮助。
本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。