论不使用ObjectDataSource之数据绑定控件纯代码实现是否更优化?

简介:


看了园子里面的两篇关于数据绑定的文章(使用objectdatasource结合数据绑定控件进行简单三层架构的开发 和 使用objectdatasource结合数据绑定控件进行简单三层架构的开发 [绝版]),终于让我按捺不住想写点我的看法。

对于数据绑定的相关使用,我跟许多人一样,也有着许多的感受。
一开始先是使用VS 2003中的DataGrid+SqlConnection、SqlCommand、SqlDataAdapter,到后来使用VS 2005中的GridView+ObjectDataSource。当那些SqlConnection、SqlCommand、SqlDataAdapter都被ObjectDataSource一次性搞定,其简洁的数据绑定代码让我兴奋不已,的确帮我省去了不少的工夫。然而好景不长,在项目的实际需求开发中,逐渐发觉它的存在反而降低了代码的灵活性和重用性,程序似乎是变得“傻瓜化”了,同时把我也弄得有些“傻瓜化”了,^_^ 以至于后来忍痛割爱,但凡数据绑定控件的相关问题干脆用代码实现。

现在还来谈论GridView以及ObjectDataSource的使用,的确有点老生常谈的感觉,但我希望通过这个切入点来讨论一下我对服务器控件的使用心得,以及相关的一些看法:

一、 我个人觉得,对于服务器控件,能不用的地方就尽量不要使用。比如说,能用html的table来展现的数据,就不必要使用Repeater,而能用Repeater很好展现数据的时候就不必要使用DataList,逼不得已才使用GridView以及DetailsView等等。牛刀也能杀鸡,但更合理的做法应该是让牛刀在杀牛的时候才使用。所以,我在使用控件的时候,考虑更多的是让代码尽量简洁高效,但绝不是偷工减料。

二、 我个人觉得,即使在使用服务器控件的时候,相关的代码应该尽量在后台完成。这样做的原因,一是提高了代码的灵活性;二是提高了代码的可重用性。毕竟aspx前台页面承载的东西太多,HTML、CSS、JavaScript已经让它变得很臃肿,加之在VS 2005中,aspx前台页面是不能调试的(VS 2008中应该可以了),要是再把一些服务器控件的代码过多的堆砌上去,可想而知,它的可读性和维护性是多么让人晦涩的。

三、 我个人觉得,对于数据库访问方面的一些技术和控件,应该尽量使用权威性和大众化的。权威性的东西(我这里意指得到大多数人认同的东西)在一定程度上就表示了它的健壮性、安全性以及可行性。观众的眼睛是雪亮的,所以我更相信群众。而大众化的东西在团队编程和版本更新等等方面更容易融合。所以,在简单的项目开发中,数据库访问方面我认为一般使用SqlHelper或者企业库就能够应付;而对于复杂庞大的系统,能够用上LINQ或者NHibernate也应该足够。毕竟我们是在帮客户开发产品,客户喜欢的应该是最美的结果,而不是最复杂的技术。

四、 我个人觉得,从事编程不久(或者说内力不深)的程序员,更应该有一个务实的心态。比如我,刚来园子的时候,特别好奇于各种新鲜的技术,首页的文章惟恐一篇被我漏过。结果囫囵吞枣,似懂非懂,导致自己对技术的掌握反倒华而不实。就拿当时刚刚兴起的AJAX来说,在DotNET中其实三个控件就可以搞定。所以,一般情况下只需要掌握了它的相关原理并能灵活的使用,就足已应对大部分的情况了。如果在一个对局部刷新要求并不高的系统中,硬是给它安个AJAX框架之类的东东,那恐怕不只是画蛇添足的问题了。我这样说只是强调,我们应该花更多的时间来看一些全面深入的书籍以及系统的帮助上,以提高自己的内力。只有内功深厚了,才能以不变应万遍的面对各种接踵而来的技术革新和项目难题。

当然,这些观点都只是我的片面之词,不具有权威性和可靠的正确性,错漏之处还请给予斧正。

为了免除我在这里纸上谈兵的尴尬,特地编写了一个Demo以体现我上述的相关观点和编程习惯。下面的这种设计方式应该足够应付小型系统的开发。
它的特点是:没有使用ObjectDataSource控件,数据绑定控件的设置全部是以代码实现,还有就是三层结构的思想+改进的SqlHelper数据库操作。而优点就是我上面所提及的。

先来看看相关截图:


页面运行前的GridView控件


页面运行后的GridView控件展现


页面运行后GridView控件的编辑状态

实现步骤:
一、在aspx页面上,只放入一个GridView控件并指定其ID。
Default.aspx

<% @ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
     < title >GridView_Demo </ title >
</ head >
< body >
     < form  id ="form1"  runat ="server" >
     < div >
         < asp:GridView  ID ="myGrid"  runat ="server"   >
         </ asp:GridView >
     </ div >
     </ form >
</ body >
</ html >

二、在aspx.cs类文件中,把GridView控件的各种外观设置,数据绑定等等都用代码的形式控制,这样做的好处是对GridView能够灵活的控制,代码的重用性极高。弱点应该是代码量比较大(或许还有我看不见的)。
Default.aspx.cs

using System;
using System.Data;
using System.Configuration;
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;
// myself
using System.Drawing;

public  partial  class _Default : System.Web.UI.Page 
{
    private Employees.Employees_BLL bll = new Employees.Employees_BLL();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //设置GridView外观样式
            setGridViewStyle();

            //创建及设置Fields字段
            setFields();

            //设置 GridView 数据源绑定
            GridBind();
        }

        //以后台的方式添加 GridView 的各类事件
        myGrid.RowEditing += new GridViewEditEventHandler(myGrid_RowEditing);
        myGrid.RowUpdating += new GridViewUpdateEventHandler(myGrid_RowUpdating);
        myGrid.RowCancelingEdit += new GridViewCancelEditEventHandler(myGrid_RowCancelingEdit);
        myGrid.RowDeleting += new GridViewDeleteEventHandler(myGrid_RowDeleting);
    }


    方法  方法

    // GridView 编辑操作
    protected void myGrid_RowEditing(object sender, GridViewEditEventArgs e)
    {
        //设置编辑行的索引
        myGrid.EditIndex = e.NewEditIndex;

        //设置更新与取消按钮之背景颜色
        myGrid.Columns[0].ControlStyle.BackColor = Color.LightSteelBlue;
        myGrid.Columns[1].ControlStyle.BackColor = Color.LightSteelBlue;
        myGrid.ShowFooter = true;
        //设置GridView在编辑模式时,TextBox字段宽度及背景颜色
        
//EmployeeID字段
        myGrid.Columns[2].ControlStyle.Width = 80;
        myGrid.Columns[2].ControlStyle.BackColor = Color.LightBlue;
        myGrid.Columns[2].FooterText = "不可编辑";
        myGrid.Columns[2].FooterStyle.BackColor = Color.Red;
        //LastName字段
        myGrid.Columns[3].ControlStyle.Width = 80;
        myGrid.Columns[3].ControlStyle.BackColor = Color.LightBlue;
        myGrid.Columns[3].FooterText = "不可编辑";
        myGrid.Columns[3].FooterStyle.BackColor = Color.Red;
        //FirstName字段
        myGrid.Columns[4].ControlStyle.Width = 80;
        myGrid.Columns[4].ControlStyle.BackColor = Color.LightBlue;
        myGrid.Columns[4].FooterText = "可编辑";
        myGrid.Columns[4].FooterStyle.BackColor = Color.Red;
        //Title字段
        myGrid.Columns[5].ControlStyle.Width = 100;
        myGrid.Columns[5].ControlStyle.BackColor = Color.LightPink;
        myGrid.Columns[5].FooterText = "可编辑";
        myGrid.Columns[5].FooterStyle.BackColor = Color.Red;
        //Address字段
        myGrid.Columns[6].ControlStyle.Width = 120;
        myGrid.Columns[6].ControlStyle.BackColor = Color.LightPink;
        myGrid.Columns[6].FooterText = "可编辑";
        myGrid.Columns[6].FooterStyle.BackColor = Color.Red;
        //City字段
        myGrid.Columns[7].ControlStyle.Width = 80;
        myGrid.Columns[7].ControlStyle.BackColor = Color.LightGreen;
        myGrid.Columns[7].FooterText = "可编辑";
        myGrid.Columns[7].FooterStyle.BackColor = Color.Red;
        GridBind();
    }

    // GridView 更新操作
    protected void myGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        if (e.NewValues != e.OldValues)
        {
            Employees.Employees_Model model = new Employees.Employees_Model(); 
            model.EmployeeID = Convert.ToInt32(myGrid.Rows[e.RowIndex].Cells[2].Text.Trim());
            //Employees_DAL 中的 where 条件为 EmployeeID and LastName, 所以 LastName 不能更改
            model.LastName = myGrid.Rows[e.RowIndex].Cells[3].Text.ToString();
            model.FirstName = ((TextBox)myGrid.Rows[e.RowIndex].Cells[4].Controls[0]).Text.ToString();
            model.Title = ((TextBox)myGrid.Rows[e.RowIndex].Cells[5].Controls[0]).Text.ToString();
            model.Address = ((TextBox)myGrid.Rows[e.RowIndex].Cells[6].Controls[0]).Text.ToString();
            model.City = ((TextBox)myGrid.Rows[e.RowIndex].Cells[7].Controls[0]).Text.ToString();
            //Employees.BLL.Employees_Model bll = new Employees.BLL.Employees_Model();
            bll.Update(model);

            //取消编辑时隐藏Footer
            myGrid.ShowFooter = false;
            //设置"编辑"和"删除"按钮还原为系统定义的颜色
            myGrid.Columns[0].ControlStyle.BackColor = Color.LightPink;
            myGrid.Columns[1].ControlStyle.BackColor = Color.LightPink;
            myGrid.EditIndex = -1;
            GridBind();
        }

    }

    // GridView 取消事件
    protected void myGrid_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        //取消编辑时隐藏Footer
        myGrid.ShowFooter = false;
        //设置"编辑"和"删除"按钮还原为系统定义的颜色
        myGrid.Columns[0].ControlStyle.BackColor = Color.LightPink;
        myGrid.Columns[1].ControlStyle.BackColor = Color.LightPink;
        myGrid.EditIndex = -1//取消编辑状态
        GridBind();
    }

    // GridView 删除操作
    protected void myGrid_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        //设置更新与取消按钮之背景颜色
        myGrid.Columns[0].ControlStyle.BackColor = Color.LightSteelBlue;
        myGrid.Columns[1].ControlStyle.BackColor = Color.LightSteelBlue;
        // 获取 Employees_DAL 中的 where 条件: EmployeeID and LastName
        int strEmployeeID = Convert.ToInt32(myGrid.DataKeys[e.RowIndex].Values[0]);
        string strLastName = myGrid.Rows[e.RowIndex].Cells[3].Text.ToString();
        bll.Delete(strEmployeeID, strLastName);  //删除
        GridBind();
    }
 
}

三、这是业务逻辑层,如果代码量不大,可以整合到aspx.cs类文件中。
Employees_BLL.cs

using System;
using System.Data;

namespace Employees
{
    /// <summary>
    
/// 业务逻辑类Employees_BLL 的摘要说明。
    
/// </summary>

    public class Employees_BLL
    {
        private readonly Employees.Employees_DAL dal=new Employees.Employees_DAL();
        public Employees_BLL()
        {}
        成员方法  成员方法
    }

}

四、数据访问层,这个没有什么好说的。
Employees_DAL.cs

using System;
using System.Data;
using System.Text;
using System.Data.SqlClient;

namespace Employees
{
    /// <summary>
    
/// 数据访问类Employees_DAL
    
/// </summary>

    public class Employees_DAL
    {
        public Employees_DAL()
        {}
        成员方法  成员方法
    }

}

五、数据实体类,关于这个我不得不提及请指点--关于数据访问层(2)这篇文章中作者的第一个问题,我个人觉得实体类的属性尽量保持跟数据库表的字段保持一致,如果项目实际需要,也可以在其中既包括外键ID也包含外键ID对应的名称。
Employees_Model.cs

using System;

namespace Employees
{
    /// <summary>
    
/// 实体类Employees_Model
    
/// </summary>

    public class Employees_Model
    {
        public Employees_Model()
        {}
        Model Model
    }

}

六、扩充了相关功能的SqlHelper
DbHelperSQL.cs

Demo下载:Employees_Demo.rar
说明:由于SQL 2000中,默认Northwind数据库的Employees表的EmployeeID字段存在约束和主外键关系,所以删除记录时会报错。在这里,我简单的创建了一个myNorthwind数据库,并添加了一个Employees表(在App_Data文件夹中)。




本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2008/04/23/1168398.html,如需转载请自行联系原作者

相关文章
|
10月前
|
人工智能 数据可视化 机器人
大模型、智能制造与显示技术融合应用 助力制造业加速数智化转型
大模型、智能制造与显示技术融合应用 助力制造业加速数智化转型
|
编解码 计算机视觉
图像金字塔
【6月更文挑战第4天】图像金字塔。
149 1
|
新零售 人工智能 供应链
排队免单返利商城系统开发|成熟源码部署|案例详情
新零售业是零售业发展的重要趋势,它通过技术的创新和变革,重新定义了传统零售业的模式和方式
|
缓存 网络协议 安全
Linux工具篇-NFS多客户端文件一致性探索
文件锁是文件系统的最基本特性之一,应用程序借助文件锁可以控制其他应用对文件的并发访问。NFS作为类UNIX系统的标准网络文件系统,在发展过程中逐步的原生支持了文件锁 (
2049 0
Linux工具篇-NFS多客户端文件一致性探索
|
架构师 NoSQL 数据库
「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
|
XML Java 关系型数据库
Spring boot(SpringMVC)使用mybatis的delete方法返回值
Spring boot(SpringMVC)使用mybatis的delete方法返回值
1136 0
|
jenkins 持续交付 容器
Kubernetes集群上基于Jenkins的CI/CD流程实践
本节我们通过在Kubernetes集群上创建并配置Jenkins Server实现应用开发管理的CI/CD流程,并且利用Kubernetes-Jenkins-Plugin实现动态的按需扩展jenkins-slave。
18697 0
|
弹性计算 负载均衡
阿里云高校计划第三天——SLB负载均衡实践
负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性。 负载均衡通过设置虚拟服务地址,将添加的ECS实例虚拟成一个高性能、高可用的应用服务池,并根据转发规则,将来自客户端的请求分发给云服务器池中的ECS实例。 负载均衡默认检查云服务器池中ECS实例的健康状态,自动隔离异常状态的ECS实例,消除了单台ECS实例的单点故障,提高了应用的整体服务能力。此外,负载均衡还具备抗DDoS攻击的能力,增强了应用服务的防护能力。
413 0
阿里云高校计划第三天——SLB负载均衡实践
|
应用服务中间件 API 网络安全
apigateway-kong(三)Proxy规则
本篇详细记录了Kong的代理功能及其路由功能和内部工作。   Kong公开了几个可以通过两个配置属性进行调整的接口:proxy_listen,默认8000,它定义Kong将接受来自客户端的公共流量并将其代理到您的上游服务的地址/端口列表。
3424 0
|
消息中间件 Java Apache
SpringBoot整合ActiveMQ:专业负责MQ20年~
ACTIVEMQ ActiveMQ 下载MQ后启动一下(Windows版本) #启动信息 ... jvm 1 | INFO | Listening for connections at ws://JackWen:61614?maximumConnections=1000&wireFormat.
1557 0