当前位置: 首页 > 编程日记 > 正文

ASP.NET重用代码技术 - 代码绑定技术

作者: 苏红超  
 
导读
  代码绑定是ASP.NET提供的一个重要的新技术。本文将会为您展示如何利用代码绑定技术来实现Web页面表示层和商业逻辑代码的分离,并建议您使用代码绑定技术实现代码的可重用。在接下来的另外一篇文章当中,我们会给出另外的一种实现代码可重用的实现技术。
  
  ASP.NET中的代码绑定技术
  
  当你在建立自己的ASP.NET应用程序的时候使用代码绑定技术带来的一个主要的优点是:它可以让你很容易的将可见层(那些HTML代码和服务器端控件)同你的表现代码(这些代码有可能是VB,C#或者其他的任何.NET支持的语言)自由的分离开来。当你有一个多人的开发小组开发同一个项目的时候,这个优势就更加明显。某个人可能负责web页面的设计和编写,而另外的一个人可能是负责页面相关的具体程序的开发。因而通过将各自的工作范围分割的做法,可以轻松的实现双方不会在无意之间破坏对方的工作成果。当然,要做到页面能够正常的运行,各自之间的良好低ㄒ彩潜夭豢缮俚摹?
  
  当我们使用代码绑定技术的时候,可视层的代码是存在于后缀为ASPX的文件当中。这是一个新的.NET扩展名,用来描述一个ASP文件。在以前的ASP中很难做到一个页面当中没有任何脚本程序只有HTML代码(当然如果你毫无意义这样作也是可以的)。然而现在代码绑定技术允许ASPX文件仅仅包含HTML代码和服务器端控件,并且允许开发者完全的使用面向对象方式来实现一个解决方案。通过一个分开的代码文件中访问这个ASPX文件的这样一种机制可以实现上面的设想。这些文件在浏览器第一次发出请求的时候被编译成单独的二进制文件,如下图所示:
  
  
  
  代码绑定文件是一个独立的文件,可以使用任何.NET支持的语言编写。比如,使用Visual Basic .NET来编写这些文件,它的扩展名将会是“vb”。这个代码绑定的代码包含了所有的和表示层相关的事件、功能函数、方法等等。每一个ASPX文件只能通过一个代码绑定文件实现。
  
  当然,通过一定的工作,代码绑定技术可以用在多种需要可重用代码的环境当中。每一个ASPX文件有他们自己的代码绑定文件,并且多个功能类似的ASPX文件可以共享一个公共的代码绑定文件。本文会展示如何实现你的ASPX文件的最基本代码绑定技术,并且会详细讨论代码绑定技术如何被应用于代码可重用方面。以后的文章当中,我们会陆续介绍.NET架构提供的其他也可以容易实现代码重用的技术,比如用户控件,编译的集合等等。 让我们来大致看一下一个例子,来看看如何实现代码绑定技术。为了简单起见,我们的例子会以一个简单的搜索页面作为开始。当我们一步步通过代码绑定技术建立我们的搜索页面之后,我们就会能够看到代码绑定技术是如何实现一个代码重用的ASPX文件。为了使得ASP.NET程序正常运行,你必须安装.NET架构Beta1。如果要使得本文提出的程序正常运行,您必须安装SQL Server2000。
  
  一步步实现代码绑定技术
  首先,我们需要建立一个.ASPX文件。在这个ASPX文件当中,我们需要使用@page指令来说明我们正在使用一个代码绑定的文件。为了做到这一点,我们需要设置两个属性:src以及inherits。Src属性指定了包含实际代码的文件,如果没有这个属性,则在属性inherits中指定的类会从编译时候传递的参数中寻找。Inherits属性指定在源文件中存在的类。这个类需要从Page类中派生。我们的具体例子如下:
  
  <%@ Page Language="vb" AutoEventWireup="false" src="Search.VB" Inherits="Search"%>
  
  接下来,我们需要添加适当的控件来建立我们的用户界面。既然我们的例子页面是一个简单的搜索页面,我们只需要加入很少的一部分控件就可以了。除了一些标签标记,我们需要增加一个搜索的文本框,一个提交搜索的按钮,以及一个DataGrid控件来显示数据库中的内容。下面是代码:
  
  <%@ Page Language="vb" src="search.vb" inherits="Search" %>
  <html>
  <head>
  <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
  <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
  </head>
  <body>
  <form id="SearchMain" method="post" runat="server">
  <p>
  <asp:Label id=lblTitle runat="server" Font-Names="Arial"
  Font-Bold="True">Worldwide Books Search</asp:Label>
  </p>
  <p>
  <asp:Label id=lblCriteria runat="server" Font-Names="Arial"
  Font-Italic="True">Search Criteria</asp:Label><br>
  <asp:TextBox id=txtSearch runat="server"></asp:TextBox>
  </p>
  <p>
  <asp:Button id=cmdSearch runat="server" Text="Search"></asp:Button>
  </p>
  <p>
  <asp:DataGrid id=grdBooks runat="server" Font-Names="Arial"
  ForeColor="Black" Font-Size="Smaller">
  <property name="AlternatingItemStyle">
  <asp:TableItemStyle HorizontalAlign="Left" VerticalAlign="Top"
  BackColor="Salmon">
  </asp:TableItemStyle>
  </property>
  <property name="FooterStyle">
  <asp:TableItemStyle ForeColor="White" BackColor="Silver">
  </asp:TableItemStyle>
  </property>
  <property name="ItemStyle">
  <asp:TableItemStyle HorizontalAlign="Left" VerticalAlign="Top" BackColor="White">
  </asp:TableItemStyle>
  </property>
  <property name="HeaderStyle">
  <asp:TableItemStyle Font-Bold="True" ForeColor="White"
  BackColor="Navy">
  </asp:TableItemStyle>
  </property>
  </asp:DataGrid>
  </p>
  </form>
  </body>
  </html>
  
  下面是运行后的界面:
  
  
  下面,我们需要建立我们的代码绑定页面。(如果我们使用Visual Studio.NET Beta1来构建我们的ASPX文件的话,那么系统会在ASPX生成的同时,自动的产生相关的代码绑定文件)。在这篇文章,我们的例子使用的VB语言,当然其他任何被支持的语言(比如:C#,C++)也能被使用。为了使得代码绑定页面正常工作,一些项目需要在源文件当中包含进来。如下:
  
  一些相关的集合名称控件需要引用
  ASPX文件所要继承的公共类需要存在,并且这个类需要继承System.Web.UI.Page
  控制变量的声明
  对于我们的例子,我们需要引用System.Web.UI.WebControls这个名称空间来存取Web控件的类。为了操作数据库中的资料,我们需要引用System.Data和System.Data.SQL这两个名称空间。引用System.Collections名称空间允许我们使用哈希表来捕获应用程序的相关设定。通过Microsoft.VisualBasic这个名称空间,我们可以使用一些VB的函数库。
  
  接下来,我们需要建立一个公共的类使得我们的ASPX文件可以继承它。类的名称应当和我们的ASPX文件中指令@page的属性inherints指定的名称相同。这个类应当继承System.Web.UI.Page。通过继承上面的类,我们建立的类就可以存取ASPX页面了。
  
  最后,我们需要声明我们在程序中用到的控件,尤其是我们的按钮控件,这样我们就可以捕获到按钮的click事件了。为了能做到这点,我们需要在类中建立这些用来表现我们的按钮和文本框的变量。这些变量需要使用WithEvents关键字来建立,如下所示:
  
  Protected WithEvents cmdSearch As System.Web.UI.WebControls.Button
  Protected WithEvents txtSearch As System.Web.UI.WebControls.TextBox
  
  这样,我们的代码绑定页面看起来如下:
  
  Option Strict Off
  Imports System.Data
  Imports System.Data.SQL
  Imports System.Web.UI.WebControls
  Imports System.Collections
  Imports Microsoft.VisualBasic
  
  Public Class Search
  Inherits System.Web.UI.Page
  Protected WithEvents cmdSearch As System.Web.UI.WebControls.Button
  Protected WithEvents txtSearch As System.Web.UI.WebControls.TextBox
  
  Protected Sub Search_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
  
  If Not IsPostback Then ' Evals true first time browser hits the page
  End If
  End Sub
  
  End Class
  
  应当注意到的是,如果我们是使用Visual Studio.NET Beta1来工作的,它会自动的帮助我们生成大部分的代码。
  
  这样就基本完全的实现了一个使用了代码绑定技术的页面的编写。对于我们的例子来说,很显然我们需要加入实际的代码来真正实现搜索和结果的显示。所以,我们要建立一个公共的子过程,在搜索按钮被按下的时候会调用这个公共的子过程。在我们的例子当中,相应的代码大致如下:
  
  Public Sub cmdSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles cmdSearch.Click
  
  关键字Handles表示当cmdSearch按钮的click事件被触发的时候会执行我们的这个公共子程序。(另外需要做的一件事情是,需要在page_load事件中监测Page.IsPostBack的值是否是true,在监测Page.ISPostBack属性的时候,我们也同时进行真正的搜索工作)。接下来的代码就只是简单的按照输入的条件在数据库pubs中搜索,并且返回搜索结果给DataGrid控件。
  
  可重用表现怎样?
  上面我们做的工作的成果就是将我们的用户界面从程序代码中分离了出来。但是这对可重用起到了什么激励作用呢?代码绑定技术对于组织程序代码来讲是一项卓越的技术,但是它或许仅仅对那些在某些环境下的代码重用有帮助作用,主要是这个技术非常适合于在需要建立两个为了相同或相似目的页面的时候使用,这时候起到了很好的代码重用的作用。比如,假设你需要为两种不同类型的用户建立两个登陆页面,并且两个页面在外观界面上面有很大不同(但是实际上的起到的作用是非常类似的)。这样建立两个ASPX文件,他们共用一个相同的代码绑定文件是非常明智的做法。另外的一个例子则看起来有些极端化—那就是或许你的应用程序当中有一些页面同时需要德文和英文两个版本!
  对于我们的例子,我们接下来要建立一个看起来比较吸引人的页面,因为使用了不少的图片;如果要看到最佳的效果,需要浏览器采用800 X600的分辨率。而我们最初的原始页面则可以用到在一个Pocket PC上面的浏览器观看(在Pocket PC上面屏幕大小是非常宝贵的,而不建议采用过多毫无意义的图片)。这样,我们只需要建立一个另一个简单的ASPX文件,在这个ASPX文件的@page指令当中引用相同的源文件(src属性)以及类(inherits属性)。这个比较美观的页面界面如下:
  
  
  
  当你提交一个搜索请求的时候,无论是我们的第一个原始页面还是现在的这个比较美观的页面,都会通过search.vb这个文件来执行搜索动作。返回结果的页面因为各自的样式设置不同会稍稍有所差别,但是实际上他们使用的都是同一段代码而得到的需要的数据。
  我们的第一个简单的页面搜索之后的界面如下:
  
  
  
  相同的,界面比较美观的页面返回的搜索结果界面如下:
  
  
  
  
  局限性
  使用代码绑定技术实现的代码重用有没有一些局限性呢?不幸的是,答案是肯定的,这个技术有一些主要的局限性。其中一个较大的局限性就是一个ASPX文件仅仅能够继承一个类。这就意味着开发者将不得不为每一个ASPX页面开发一个针对它的代码绑定页面,除非是遇到了上面的我们曾经描述过的相似情节才可以多个ASPX文件共享一个公用的代码绑定页面。
  
  另外的一个代码重用的限制是:如果那些ASPX页面差别很大,你会在重利用代码绑定页面的时候有一些麻烦。记住,在代码绑定类方面,在ASPX页面上的那些控件是使用WithEvents关键字来声明的。如果一个控件在其中的某一个ASPX页面上面,而另外的一个ASPX页面没有这个控件,你就不能使用控件声明的方式,而要使用Page.FindControls方法来的到这个控件的一个引用,当然前提是如果在某个页面上存在这个控件的话(如果不存在,会返回”nothind”)。通过这个方法,我们可以调用控件的属性、方法,但是不能捕获到控件的事件。因此,如果控件不同时存在于页面上的话,我们就不能使用event handling。如果我们想要能够捕获控件的事件,我们需要使用另外的一种代码重用技术—用户控件技术,这是另外的一篇文章探讨的内容了。
  
  总结
  在这篇文章当中,我们探讨了使用代码绑定技术的基本概念,同时也给出了一个实际的例子,就是两个不同的ASPX文件共享一个通用的代码绑定类。我们也探讨了使用代码绑定技术实现代码重用的优点和局限性



相关文章:

【ZooKeeper Notes 3】ZooKeeper Java API 使用样例

查看PDF版本 转载请注明&#xff1a;ni掌柜 nileadergmail.com ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务框架&#xff0c;包含一组简单的原语集合。通过这些原语言的组合使用&#xff0c;能够帮助我们解决更高层次的分布式问题&#xff0c;关于Zo…

一站式了解多模态、金融、事理知识图谱构建指南 | AI ProCon 2020

整理 | 许爱艳出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】7 月 3-4 日&#xff0c;由 CSDN 主办的第三届 AI 开发者大会&#xff08;AI ProCon 2020&#xff09;在线上举行。本次大会有超万人报名参与&#xff0c;参与人群覆盖 60 领域、5000…

CentOS7安装配置redis-3.0.0

一.安装必要包 yum install gcc 二.linux下安装 #下载 wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar zxvf redis-3.0.0.tar.gz cd redis-3.0.0 #如果不加参数,linux下会报错 make MALLOClibc 安装好之后,启动文件 #启动redis src/redis-server &#关闭re…

ASP.NET重用代码技术 - 用户控件技术

作者&#xff1a; 苏红超 使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行。我们发现&#xff0c;利用代码绑定技术我们可以容易的将我们的代码和内容分离开来&#xff0c;利用它可以建立可重用的代码&#xff0c;只是这种技术本身也存在着一些局限性。在本文中&…

liunx 下dhcp中继及服务器配置

dhcp:动态主机配置协议 使用udp协议 端口为67&#xff08;服务&#xff09;&#xff0c;68&#xff08;客户&#xff09; 作用&#xff1a;动态分配地址等参数 工作模式 1. 手工 manual server—地址池 &#xff08;ip—mac&#xff09; 2222----1.1.1.1 dhcpclient ------地址…

PyCharm vs VSCode,是时候改变你的 IDE 了!

作者 | Sohaib Ahmad译者 | 鹿未来&#xff0c;责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;也许是我有些落伍&#xff0c;或者也是因为JetBrains在Python IDE的市场上占有很大的份额&#xff0c;以至于直到最近我才发现&a…

(转)Linux 下 查看以及修改文件权限

场景&#xff1a;Linux环境下远程部署项目&#xff0c;发现因为文件权限问题&#xff0c;不能执行远端的可执行文件。问题还没解决&#xff0c;待议。。。 1 查看权限 在终端输入: ls -l xxx.xxx &#xff08;xxx.xxx是文件名&#xff09; 那么就会出现相类似的信息&#…

软件文档知多少?

作者&#xff1a;由于本人在无数网站看到此文 无法确定第一作者 请作者与本人联系如今&#xff0c;软件开发越来越复杂&#xff0c;软件功能也越来越丰富。而几乎所有成熟的商业软件&#xff0c;都是靠一个开发团队齐心协力的血汗结晶。“罗马不是一天建成的&#xff01;”&…

在 VMware ESXi 5.0 上安装万兆网卡驱动

2012年02月28日 | 标签: vmware esxi | 作者&#xff1a;vpsee 转载自&#xff1a;http://www.vpsee.com/2012/02/intall-network-card-driver-on-vmware-esxi-5-0/ 昨天刚发现新购的 Dell PowerEdge R710 服务器上配的 Intel Ethernet Server Adapter X520-T2 万兆网卡居然在…

漫谈 ClickHouse 在实时分析系统中的定位与作用

ClickHouse 是一款由俄罗斯Yandex公司开源的OLAP数据库&#xff0c;拥有着卓越的性能表现&#xff0c;在官方公布的基准测试中&#xff0c;ClickHouse的平均响应速度是Vertica的2.63倍、InfiniDB的17倍、MonetDB的27倍、Hive的126倍、MySQL的429倍以及Greenplum的10倍。自2016年…

Js+Dhtml:WEB程序员简易开发工具包(预先体验版)

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/<HTML> <HEAD> <META http-equivContent-Type contenttext/html;charsetgb2312> <META nameGemeratpr content网络程序员伴侣(Lshdic)2005_开拓版> <TITLE>LD5工具</TITLE> <st…

残差网络的前世今生与原理 | 赠书

本文内容节选自《深度学习之模型设计&#xff1a;核心算法与案例实践》&#xff0c;作者言有三。本书详解了数十年来深层卷积神经网络模型的主流设计思想&#xff0c;理论讲解细致&#xff0c;实战案例丰富&#xff0c;是熟练掌握深度学习模型使用的必备参考资料。想要了解关于…

python---简单数据库

2019独角兽企业重金招聘Python工程师标准>>> #simple database#people people {Alice:{phone:2341,addr:Foo drive 23},Beth:{phone:9102,addr:Bar street 42},Ceil:{phone:3158,addr:Baz avenue 90} }#describe labels {phone:phone number,addr:address }name …

Linux系统之路——如何在CentOS7.2安装MySQL

一、Mysql 各个版本区别&#xff1a;1、MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;但不提供官方技术支持。2、MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;可以试用30天。3、MySQL Cluster 集群版&#xff0c;开源免费。可将几个M…

Vml+Dhtml:制作一个应用渐变颜色效果不错的进度条

//原作:风云舞,载自: http://www.lshdic.com/bbs<HTML xmlns:v> <HEAD> <META http-equivContent-Type contenttext/html;charsetgb2312> <Meta nameGemeratpr content网络程序员伴侣(Lshdic)2004> <TITLE>效果不错的VML进度条</TITLE> &l…

使用inno setup打包程序完整脚本(.net框架检测,重复安装检测)

; 脚本由 Inno Setup 脚本向导 生成&#xff01;; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档&#xff01;#define MyAppName "小小鸟软件"#define MyAppVersion "2012.2.29"#define MyAppPublisher "小小鸟科技"#define MyAppURL &…

GPT-3到来,程序员会被AI取代吗?

作者 | Frederik Bussler译者 | 弯月&#xff0c;编辑 | 屠敏题图 | 自东方 IC出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;2017年的时候&#xff0c;曾有研究人员问&#xff1a;到2040年人工智能是否承担起大多数的编程工作&#xff1f;如今OpenAI的G…

iOS开发几年了,你清楚OC中的这些东西么!!!?

iOS开发几年了,你清楚OC中的这些东西么!!!? 前言几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的…

在做会员资料修改时,实现下拉菜单的默认项定位

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/ <!--在写一个交友网站时碰到的问题,就是当会员修改资料时&#xff0c;如何定位SELECT的菜单列默认项&#xff0c;不过很容易就解决了--> <HTML> <HEAD> <META http-equivContent-Type contenttex…

NFS 文件共享的创建过程

nfs 文件共享的服务器 nfs服务需要两个软件包nfs-utils和portmap 启动nfs服务 # service portmap start # service nfs start # chkconfig nfs on 开机自动启动 配置文件&#xff1a; /etc/exports 想要共享某个文件则编辑配置文件 共享目录 共享IP&#xff08;共享属性&…

行业新风向!AI人才缺口30万,单个项目最高补贴1000万元!

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

Robotium todolist.test.elements

2019独角兽企业重金招聘Python工程师标准>>> ElementsEditToDoItemActivity package com.example.todolist.test.elements;import android.widget.Button; import android.widget.EditText;import com.example.todolist.R; import com.robotium.solo.Solo;public cl…

经典的导航二级式导航菜单增强版

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/<!--呵呵我发的上一版相信大家都看过了吧&#xff0c;想一想上一版的确是不怎么华丽&#xff0c;而且上一版是针对表格内的连接A而定位的而这一版的优点显然比上一版要华丽&#xff0c;速度一样快&#xff0c;而且是针…

【海洋女神原创】installshield 32位打包和64位打包的注意事项

32/64位问题要把握几点&#xff1a;1. 明确你的产品是否需要区分32/64位2. 明确你的产品中是否有32/64位的服务注册3. 了解InstallShield Build出来的安装包本身是32位应用程序4. 了解Windows 64位系统上的32位路径和64位路径差异以及如何在InstallShield的系统变量中找到对应的…

如何提高模型性能?这四大方法值得尝试 | CSDN 博文精选

作者 | BoCong-Deng编辑 | 屠敏封图 | 自东方 IC出品 | CSDN 博客写在前面在我们进行模型训练时&#xff0c;如果你只是想要让模型具有不错的性能&#xff0c;那么盲目地尝试网络架构足以达到目的。而在本文中&#xff0c; 我们将为你提供一套用于构建最先进深度学习模型的必备…

ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程

1、副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录&#xff0c;所以需要对一年前2015年5月1日的数据进行恢复。而2016年初因为进行迁移&#xff0c;所以有些文件可能丢失&#xff0c;手上只有rman全备文件&#xff0c;希望在一天之内找回&a…

C语言文件等题

1.#include <stdio.h>double fun(int n){ }main(){ int n; double s; printf("\nInput n: "); scanf("%d",&n); sfun(n); printf("\n\ns%f\n\n",s); NONO();}NONO(){/* 请在此函数内打开文件&#xff0c;输入测试数据&…

使用 Vml 制作立体柱状投票统计图的完整程序

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/<!--以下便是完整的 JsVml 制作柱状投票统计图的完整程序,保存为HTM文件运行即可看到效果其中 array数组中的分组可以为6个也可以为2&#xff0c;3&#xff0c;4&#xff0c;5个等,运行以下程序需要您的浏览器支持VML…

Python, C++和Java代码互翻,Facebook开发首个自监督神经编译器

译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;将早期的编程语言&#xff08;例如COBOL&#xff09;的代码库迁移到现在的编程语言&#xff08;例如Java或C&#xff09;是一项艰巨的任务&#xff0c;它需要源语言和目标语言方面的专业知识。COBOL如今仍在…

pinpoint的id的生成

traceId的生成 public String getTransactionId() {return TransactionIdUtils.formatString(agentId, agentStartTime, transactionSequence);}public static final String TRANSACTION_ID_DELIMITER "^";public static String formatString(String agentId, long …