`
terryfeng
  • 浏览: 507311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CSLA.Net 3.0.5 项目管理示例 UI RolesEdit.aspx

阅读更多

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
  CodeFile="RolesEdit.aspx.cs" Inherits="PTWeb.RolesEdit" Title="项目职务" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
  <div>
    <%-- 多视图控件 --%>
    <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
        <%-- 视图1  用于显示 --%>
      <asp:View ID="MainView" runat="server">
        <%-- 视图中的内容 
            AutoGenerateColumns="False" 代表无需自动刷新内容
            DataKeyNames="Id",代表数据主键名字,设置此值,可以获取每一行的这个值
            DataSourceID="RolesDataSource" 数据源
        --%>
        <asp:GridView ID="GridView1" runat="server"  AutoGenerateColumns="False"  DataSourceID="RolesDataSource" DataKeyNames="Id">
          <Columns>
            <%-- ReadOnly="True" 即使在编辑状态下也不能修改
                SortExpression="Name" 排序字段
            --%>
            <asp:BoundField DataField="Id" HeaderText="编号" ReadOnly="True" SortExpression="Id" />
            <asp:BoundField DataField="Name" HeaderText="职务" SortExpression="Name" />
            <%-- 启用删除按钮和编辑按钮 --%>
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
          </Columns>
        </asp:GridView>
        <asp:LinkButton ID="AddRoleButton" runat="server" OnClick="AddRoleButton_Click">添加职务</asp:LinkButton><br />
      </asp:View>
      <%-- 视图2 用户插入新数据 --%>
      <asp:View ID="InsertView" runat="server">
        <%-- OnItemInserted="DetailsView1_ItemInserted" 插入新值后调用
          OnModeChanged="DetailsView1_ModeChanged" 模式更改调用
          AutoGenerateRows="False" 无需自动刷新
          DataSourceID="RolesDataSource" 数据源
          
          --%>
        <asp:DetailsView ID="DetailsView1" runat="server" 
          AutoGenerateRows="False" DataSourceID="RolesDataSource"
          DefaultMode="Insert" Height="50px" Width="125px" 
          DataKeyNames="Id" OnItemInserted="DetailsView1_ItemInserted"
          OnModeChanged="DetailsView1_ModeChanged">
          <Fields>
            <asp:BoundField DataField="Id" HeaderText="编号"   SortExpression="Id" />
            <asp:BoundField DataField="Name" HeaderText="职务"  SortExpression="Name" />
            <%-- 显示插入按钮 --%>
            <asp:CommandField ShowInsertButton="True" />
          </Fields>
        </asp:DetailsView>
      </asp:View>   
    </asp:MultiView>
    <%-- 错误反馈标签,红色的 --%>
    <asp:Label ID="ErrorLabel" runat="server" ForeColor="Red"></asp:Label><br />
    &nbsp;&nbsp;
    <%--自定数据源控件(539)
    TypeName="ProjectTracker.Library.Admin.Roles, ProjectTracker.Library"   控件关联的业务类 逗号 业务类所在的程序集
    --%>
    <csla:CslaDataSource ID="RolesDataSource" runat="server"
      TypeName="ProjectTracker.Library.Admin.Roles, ProjectTracker.Library" 
      OnDeleteObject="RolesDataSource_DeleteObject"
      OnInsertObject="RolesDataSource_InsertObject" 
      OnSelectObject="RolesDataSource_SelectObject"
      OnUpdateObject="RolesDataSource_UpdateObject" TypeSupportsPaging="False" TypeSupportsSorting="False">
    </csla:CslaDataSource>
  </div>
</asp:Content>

 

 

 

//======================================================================
//
//        Copyright (C)       All Rights Reserved       
//        Guid1:               ac0ac771-edca-45ec-a03c-8e780c6168ba
//        CLR版本:             2.0.50727.3053
//        新建项输入的名称:    RolesEdit
//        机器名称:            SOFTWARE-FRT-08
//        命名空间名称:        PTWeb
//        文件名:              RolesEdit
//        当前系统时间:        2008-10-2 19:08:56
//        当前登录用户名:      frt
//        创建年份:            2008
//
//        Created by Terry.Feng.C (冯瑞涛) at 2008-10-2 19:08:56
//        
//
//======================================================================

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace PTWeb
{
    /// <summary>
    /// 这个程序中的代码都非常的简单,几乎很少超过200行,所以可以轻松的阅读
    /// </summary>
    public partial class RolesEdit : System.Web.UI.Page
    {
        #region 私有成员
        //枚举(539),直接使用数字会使代码难以维护和观看,定义枚举非常好,
        //比喻,可以想像如果你以后需要修改代码将MainView和InsertView这两个页面的代表调换,那么我们只需要在枚举中将0和1换个位置,尔代码无需做任何修改
        private enum Views
        {
            MainView = 0,
            InsertView = 1
        }

        /// <summary>
        /// (540) 缓存业务数据资源
        /// </summary>
        /// <returns></returns>
        private ProjectTracker.Library.Admin.Roles GetRoles()
        {
            //读取指定Session内容
            object businessObject = Session["currentObject"];
            //判断获取内容,如果是空或者与所需的类型不符合,则重新取出数据集合
            if (businessObject == null || !(businessObject is ProjectTracker.Library.Admin.Roles))
            {
                //从数据库取出数据资源
                businessObject = ProjectTracker.Library.Admin.Roles.GetRoles();
                //缓存数据资源
                Session["currentObject"] = businessObject;
            }
            //将数据资源返回
            return (ProjectTracker.Library.Admin.Roles)businessObject;
        }

        /// <summary>
        /// 应用验证规则初始化页面
        /// </summary>
        private void ApplyAuthorizationRules()
        {
            //根据当前用户CanEditObject的状态同步显示GridView的最后一列
            this.GridView1.Columns[this.GridView1.Columns.Count - 1].Visible = ProjectTracker.Library.Admin.Roles.CanEditObject();
            //同上面的道理一样,因为此系统没有真正意义上的权限系统所以这些权限的最终判断是写死的,在这里他们是Administrator
            this.AddRoleButton.Visible = ProjectTracker.Library.Admin.Roles.CanAddObject();
        }

        #endregion

        #region 窗体事件
        /// <summary>
        /// Load事件的使用多在对程序页面的初始设置上,其中的代码基本上全是围绕初始化展开的
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            //如果不是回调,一般只第一次进入
            if (!IsPostBack)
            {
                
                //清空内容对象(540)
                Session["currentObject"] = null;
                //这个方法的调用是初始化根据权限去初始化页面(547)
                ApplyAuthorizationRules();
            }
            else
                this.ErrorLabel.Text = "";
        }

       

        /// <summary>
        /// (542)加职务按钮
        /// </summary>
        /// <param name="sender">被监控的对象</param>
        /// <param name="e">事件处理中所感兴趣的东西</param>
        protected void AddRoleButton_Click(object sender, EventArgs e)
        {
            //设置模式为插入模式
            this.DetailsView1.DefaultMode = DetailsViewMode.Insert;
            //激活显示DetailsView的那个View,当然只显示这个视图,刚才的那个视图被隐藏
            MultiView1.ActiveViewIndex = (int)Views.InsertView;
        }

        /// <summary>
        /// 当插入后激发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DetailsView1_ItemInserted( object sender, DetailsViewInsertedEventArgs e)
        {
            //点击插入后,View模式还原
            MultiView1.ActiveViewIndex = (int)Views.MainView;
            //(545)表格重新绑定以刷新表格内容,DataBind的调用会使GridView刷新内容,之后导致RolesDataSource的SelectObject被触发
            this.GridView1.DataBind();
        }

        /// <summary>
        /// 在插入或者是更新等操作的时候,都有可能会点击取消操作,取消会导致模式的改变,由此引发此事件去改变显示模式,回复列表显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DetailsView1_ModeChanged( object sender, EventArgs e)
        {
            //模式一点更改,索命已经点击了插入按钮,将View视图还原
            MultiView1.ActiveViewIndex = (int)Views.MainView;
        }

        #endregion

        #region 数据控制

        /// <summary>
        /// 删除,同理点击删除按钮激发这个事件(547)
        /// </summary>
        /// <param name="sender">一般这个对象指被监视对象,是事件的发送者,一直被监视的目标。这个对象包含着其他对象所感兴趣的内容,当这个感兴趣的内容到达某种状态就会发送消息,这个消息就是事件,
        ///  比如被点击了,或者修改了,去提示监控者去调用某些处理程序,这个程序就是下面的方法。</param>
        /// <param name="e">这个对象包含这监控者所感兴趣的数据,这个会根据不同的事件尔改变(因为不同的事件都是具有不同的委托签名的),在这里指的是删除的是那条记录啊</param>
        protected void RolesDataSource_DeleteObject(object sender, Csla.Web.DeleteObjectArgs e)
        {
            try
            {
                ProjectTracker.Library.Admin.Roles obj = GetRoles();
                //获取被删除记录的那条记录的键值,
                int id = (int)e.Keys["Id"];
                //调用业务类方法设置为删除标记
                obj.Remove(id);

                //调用Save真正删除
                Session["currentObject"] = obj.Save();

                e.RowsAffected = 1;
            }
            catch (Csla.DataPortalException ex)
            {
                this.ErrorLabel.Text = ex.BusinessException.Message;
                e.RowsAffected = 0;
            }
            catch (Exception ex)
            {
                this.ErrorLabel.Text = ex.Message;
                e.RowsAffected = 0;
            }
        }

        /// <summary>
        /// (543)当用户通过DetailsView输入新的Role,在控件上点击插入连接,RolesDataSource会触发这个事件,将新角色添加到集合当中
        /// 
        /// </summary>
        ///<param name="sender">一般这个对象指被监视对象,是事件的发送者,一直被监视的目标。这个对象包含着其他对象所感兴趣的内容,当这个感兴趣的内容到达某种状态就会发送消息,这个消息就是事件,
        ///  比如被点击了,或者修改了,去提示监控者去调用某些处理程序,这个程序就是下面的方法。</param>
        /// <param name="e">这个对象包含这监控者所感兴趣的数据,这个会根据不同的事件尔改变(因为不同的事件都是具有不同的委托签名的),在这里指的是插入的是那条记录啊</param>
        protected void RolesDataSource_InsertObject( object sender, Csla.Web.InsertObjectArgs e)
        {
            try
            {
                //(544)获取列表对象
                ProjectTracker.Library.Admin.Roles obj = GetRoles();
                //调用AddNew方法,最终他会调用我们重载的AddNewCore方法,请看Roes.cs,新建一个
                ProjectTracker.Library.Admin.Role role = obj.AddNew();
                //(544)拷贝Values中的属性值,到Role这个对象中,当然你也可以使用,原始的Role.Name=e.Values["Name"].ToString;是一样的
                Csla.Data.DataMapper.Map(e.Values, role);
                
                //调用Save保存,并将被更新的结果集返回,当然你也可以,将这个操作留给一个按钮事件
                //当时请注意这个将新的结果集付给Session的动作是非常有学问的,她会在之后的显示刷新时候直接被用到,如果不付给这个缓存,那么新的结果将无法及时反映
                Session["currentObject"] = obj.Save();
                //受到影响
                e.RowsAffected = 1;
            }
            catch (Csla.DataPortalException ex)
            {
                this.ErrorLabel.Text = ex.BusinessException.Message;
                e.RowsAffected = 0;
            }
            catch (Exception ex)
            {
                this.ErrorLabel.Text = ex.Message;
                e.RowsAffected = 0;
            }
        }

        /// <summary>
        /// 选择
        /// </summary>
        /// <param name="sender">一般这个对象指被监视对象,是事件的发送者,一直被监视的目标。这个对象包含着其他对象所感兴趣的内容,当这个感兴趣的内容到达某种状态就会发送消息,这个消息就是事件,
        ///  比如被点击了,或者修改了,去提示监控者去调用某些处理程序,这个程序就是下面的方法。</param>
        /// <param name="e">这个对象包含这监控者所感兴趣的数据,这个会根据不同的事件尔改变(因为不同的事件都是具有不同的委托签名的),在这里指的是选择的是那条记录啊</param>
        protected void RolesDataSource_SelectObject( object sender, Csla.Web.SelectObjectArgs e)
        {
            //获取数据资源
            ProjectTracker.Library.Admin.Roles obj = GetRoles();
            //将资源,绑定
            e.BusinessObject = obj;
        }

        /// <summary>
        /// 更新,点击绑定的控件的更新按钮会激发数据源此事件,
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RolesDataSource_UpdateObject( object sender, Csla.Web.UpdateObjectArgs e)
        {
            ProjectTracker.Library.Admin.Roles obj = GetRoles();
            try
            {
                //转换字符串到整型,作为参数,调用业务方法获取一个职务对象引用
                //e.Keys可以获得当前控件的中DataKeyNames域中的值
                ProjectTracker.Library.Admin.Role role = obj.GetRoleById(int.Parse(e.Keys["Id"].ToString()));
                //将更改对象中名字字段的值付给Name属性,这里没有使用上面的Map功能,因为只有一列
                role.Name = e.Values["Name"].ToString();
                //调用保存方法
                Session["currentObject"] = obj.Save();
                //受影响
                e.RowsAffected = 1;
            }
            catch (Csla.DataPortalException ex)
            {
                this.ErrorLabel.Text = ex.BusinessException.Message;
                e.RowsAffected = 0;
            }
            catch (Exception ex)
            {
                this.ErrorLabel.Text = ex.Message;
                e.RowsAffected = 0;
            }
        }

        #endregion
    }
}

 

分享到:
评论

相关推荐

    C#企业应用开发艺术CSLA.NET框架开发实战.part1.rar PDF加源码

    C#企业应用开发艺术CSLA.NET框架开发实战.part1.rar(PDF加源码)

    C#企业应用开发艺术CSLA.NET框架开发实战.part2.rar

    C#企业应用开发艺术CSLA.NET框架开发实战.part2.rar

    CSLA.NET框架开发小例子集合

    通过学习和研究这些例子,开发者可以更好地掌握如何在实际项目中应用CSLA.NET框架,提升开发效率,同时保证代码的健壮性和可维护性。此外,对于初学者来说,这些实例也能帮助他们理解复杂的概念,如业务对象生命周期...

    C#企业应用开发艺术CSLA.NET框架开发实战.rar

    9. **源码分析**:附带的源码提供了丰富的示例,可以帮助读者深入理解CSLA.NET的内部工作原理,同时也可以直接用于项目开发中,加快开发进度。 10. **持续学习与社区支持**:CSLA.NET拥有活跃的社区和丰富的在线...

    CSLA.NET 4.5.601源码

    这个例子展示了如何创建一个简单的项目管理应用,包括任务分配、时间追踪等功能,是学习CSLA.NET的绝佳起点。 通过分析CSLA.NET 4.5.601的源码,开发者可以学习到如何有效地实现业务逻辑、数据访问、事务处理和安全...

    一个最完整的基于Csla.net的vb源代码

    6. **最佳实践**:从源代码中学习如何遵循Csla.Net的最佳实践,比如如何有效地管理对象状态,如何使用缓存策略,以及如何实现细粒度的权限控制。 总之,这个最完整的基于Csla.Net的VB源代码提供了丰富的学习材料,...

    [CSLA.NET] Using CSLA 4 eBook Series

    [CSLA.NET] Using CSLA 4 eBook Series ☆ 图书概要:☆ The Using CSLA 4 ebook series will teach you how to use CSLA 4 to create powerful object-oriented business layers for your applications, as well ...

    CSLA.NET 4.0 Source Code

    3. ** 设计模式 **:CSLA.NET的核心是基于几种设计模式,如工厂模式(用于对象实例化)、策略模式(用于行为的可插拔性)、代理模式(用于远程对象访问)和状态模式(用于管理对象的状态变化)。这些模式使得代码...

    《#企业应用开发艺术CSLA.NET框架开发实战》配套源码及例程csla-4.5.700

    《#企业应用开发艺术CSLA.NET框架开发实战》(Expert C#2008 Business Objects)配套源码及例程csla-4.5.700。 CSLA .NET is a software development framework that helps you build a reusable, maintainable ...

    CSLA.NET框架源码

    CSLA (Component Services Library for Applications) .NET框架是由Rockford Lhotka创建的,它为.NET平台提供了一种强大的业务对象开发模型。该框架的主要目标是帮助开发人员构建可复用、可维护和灵活的业务应用程序...

    .NET软件开发框架CSLA.NET.zip

    CSLA.NET是一个在分布式环境下只通过修改配置文件就可以实现N层部署的框架. 它致力于构建丰富,强大而灵活的业务层,包含了验证,权限,数据门户等标准化的解决方案,使你的业务对象更加标准和灵活.它提出了移动对象...

    CSLA.NET框架书本及源码

    3. **事务管理**:CSLA.NET提供了事务支持,可以轻松地在业务对象级别或整个业务流程级别管理数据库事务,确保数据一致性。 4. **安全性**:框架内置了权限和角色管理,可以限制用户对业务对象的操作,如只读、修改...

    [CSLA .NET] CSLA .NET 框架企业应用开发艺术 (2008 版本) (英文版)

    [Apress] CSLA .NET 框架企业应用开发艺术 (2008 版本) (英文版) [Apress] Expert C# 2008 Business Objects (E-Book) ☆ 图书概要:☆ In Rockford Lhotka’s Expert C# 2008 Business Objects, you’ll learn ...

    C#企业应用开发艺术CSLA.NET框架

    此外,CSLA .NET与Windows Forms、WPF、ASP.NET等UI技术无缝集成,支持数据绑定,使开发者能够轻松地创建用户界面。 **3. 安全性和权限管理** 框架中的安全特性允许对业务对象进行细粒度的访问控制,以满足不同...

    《C#企业应用开发艺术--CSLA.NET框架开发实战》源码

    此为《C#企业应用开发艺术--CSLA.NET框架开发实战》一书的源码 作 者: Rockford Lhotka 译 者: 侯伯薇 出版日期: 2010-03 .NET应用架构开发经典 揭示CSLA.NET框架的设计权衡 从实践中精通面向对象技术 ...

    CSLA.NET自动生成代码扩展模板

    Visual Studio CSLA Extension for ADO.NET Entity Framework. Visual Studio extension and T4 templates for generation of CSLA objects from ADO.NET Entity Framework model. CSLA.NET框架面向实体框架的代码...

    CSLA.NET 3.6

    5. **更完善的文档和示例**:随着版本的更新,CSLA.NET的文档通常会得到更新,提供更详尽的教程和示例,帮助开发者快速上手。 **压缩包内容分析** "README.txt" 文件很可能是包含了安装指南、更新内容和注意事项的...

    csla.net--4.6.5源码

    通过分析Csla.net 4.6.5源码,开发者可以了解到如何实现这些特性,学习到面向对象设计原则、模式的应用,以及如何在实际项目中有效地利用Csla来提高开发效率和代码质量。同时,源码阅读也帮助开发者更好地调试和优化...

    Using CSLA 4 CSLA .NET Overview

    ### 使用CSLA 4:CSLA .NET概览 #### 一、CSLA .NET简介 **CSLA(Component-based Scalable Logical Architecture)**是一种面向对象的应用程序开发框架,主要针对.NET平台。它由Rockford Lhotka创建,并在多个...

    CSLA.NET框架开发实战Expert C#2008 Business Objects

    10. **UI绑定**:CSLA.NET对象可以直接与各种UI框架(如WinForms、WPF、ASP.NET等)绑定,简化了视图层的开发。 通过阅读《CSLA.NET框架开发实战Expert C#2008 Business Objects》,读者不仅能了解到CSLA.NET的架构...

Global site tag (gtag.js) - Google Analytics