CSLA.NET快速入门系列——快速构建应用(下)
来源:广州中睿信息技术有限公司
发布时间:2012/10/21 23:25:16 编辑:itlead 阅读 1777

            上篇我们介绍了通过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开发有所帮助。

 

 本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。