ASP.NET编程中的十大技巧

在本篇文件中,我们将讨论编程人员在使用ASP.NET开发应用程序时需要注意的10个技巧,这些技巧涉及从缺省的控件、表单名的改变到StringBuilder类的使用,有助于编程人员能够尽快地适应.NET环境。

1、在使用Visual Studio .NET时,除直接或非引用的对象外,不要使用缺省的名字。

.NET带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用Notepad或WordPad等任意的文本编辑器进行编辑。如果不愿意,我们并非一定要使用Visual Studio .NET作为集成开发环境。但使用了Visual Studio .NET,我们可以在Windows文件管理器中看到文件,或在Visual Studio .NET之外从文本编辑器中浏览文件的内容。 
使用Visual Studio .NET作为集成开发环境有许多好处,其中最显著的好处是它极大地提高了生产效率。使用Visual Studio. NET,我们能够在付出较小代价的情况下更快地开发软件。作为集成开发环境一部分的IntelliSense提供自动的代码完成、在输入方法或函数时提供动态帮助、语法错误的实时提示,以及其他能够提高生产效率的功能。 
象其他复杂的工具那样,在学会如何充分发挥它的作用和掌握其“习性”前,Visual Studio .NET也会使我们产生一种挫折感。有时,它象一个难以了解的黑盒子,会生成大量的文件和许多无用的代码。 
Visual Studio .NET的一个功能是,无论是类、控件或表单中的对象,它都能够为新对象提供缺省名字。例如,如果我们创建了一个新的ASP.NET Web Application,其缺省的名字将是WebApplication1。我们可以在“新工程”对话框中方便地改变该应用的名字,但同时改变的只是该应用程序的名字空间的名字及其所在的虚拟目录,源代码文件的缺省名字仍然是WebForm1.aspx和WebForm1.aspx.cs(C#工程)或WebForm1.aspx.vb(VB.NET工程)。

我们可以在方案浏览器中改变ASPX和代码使用的文件名字,但Web页类的名字仍然将是WebForm1。如果在该Web表单上生成一个按钮,其缺省的名字将是Button1。事实上,所有控件的名字都是由控件的类型和数字组成的。 
我们能够,也应该将应用程序中所有的表单和控件的名字都修改成有意义的名字。对于较小的演示性程序而言,缺省的名字还能够胜任,但如果应用程序由多个表单,每个表单上有许多按钮和标签时,象frmStartup、frmDataEntry和frmReports这样的表单名就比Form1、Form2和Form3这样的名字更易于理解和维护。 
如果表单上控件要在代码的其他地方引用,使它有一个有意义的名字就更重要了。btnOK、btnCancel和btnPrint这样的名字使看代码的人更容易理解,因而,也比名字为Button1、Button2、Button3这样的控件更容易维护。 
修改一个工程中所有文件中出现的一个名字的一个好方法是,在Visual Studio .NET菜单中依次选择“编辑”->“发现和替换”->“替换”命令。 
在看二周前编写的代码时,我们经常就象第一次见到这些代码一样,因此使它们有一个有助于我们理解其含义的名字是十分有必要的。

2、即使不使用Visual Studio .NET进行编程,使用代码支持文件也有利于提高应用程序的性能

在Web应用程序、Web服务或Web控件等所有的ASP.NET Web工程中,Visual Studio .NET都使用代码支持文件。代码支持文件使工程具有更好的组织、模块性,更适合多人组成的开发团队。另外,它还会带来性能的提高。 
代码支持文件的内容被编译成一个组合文件中的类,一般是一个DLL文件,有时也可以是EXE文件。该文件驻留在应用程序的组合体高速缓冲区中,在应用程序启动时,可以立即得到它。 
如果代码是包含在<script>标记中或ASPX文件代码中,它仍然会被编译成一个Web页类。在这种情况下,每当该网页在应用程序对话中第一次加载时,都需要重新进行编译,被编译的类就会驻留在内存中。每当计算机启动、IIS停止、重新启动或者源代码、配置文件改变时,该文件必须重新编译。尽管不大,但这样引起的性能损耗也是相当可观的。

3、尽量减少表单回送

每当点击Web网页上的Button、LinkButton或ImageButton控件时,表单就会被发送到服务器上。如果控件的AutoPostBack属性被设置为true,如果CheckBox、CheckBoxList等控件的状态被改变后,也会使表单会发送回服务器。 
每次当表单被发送回服务器,就会被重新加载,启动Page_Load事件,执行Page_Load事件处理程序中的所有代码。把网页的初始化代码放在这里是最合适不过的了。我们经常会希望在每次加载网页时执行一些代码,而希望只有在网页第一次加载时执行另一些代码,甚至希望一些代码在除首次加载外的每次加载时执行。 
可以利用IsPostBack特性来完成这一功能。在网页第一次加载时,该属性的值是false。如果网页因回送而被重新加载,IsPostBack属性的值就会被设置为true。通过测试,可以在任意时候执行指定的代码。下面是相关的C#代码: 
protected void Page_Load(Object sender, EventArgs e) 

// 网页每次加载时,执行的一些操作 
if (!IsPostBack) 

// 网页第一次加载时执行的操作 

else 

// 回送时执行的操作 
}

// 网页每次加载时执行的操作 

我们希望尽量不引起回送(每次回送都会要求服务器进行一系列的操作),即使引起回送后。也希望能够执行尽量少的操作。大规模、浪费时间的操作(例如数据库查找)尤其应当避免,因为它们能够延长应用程序的响应时间。

4、使用StringBuilder类

字符串在.NET框架中是不可变的,这意味着改变字符串的操作符和方法会返回字符串的改变后的拷贝,这意味着性能还有提高的空间。当进行大量的字符串操作时,使用StringBuilder类就是一种比较好的选择了。 
下面的C#代码测试用二种方式从10000个子字符串中生成字符串所需要的时间。第一次使用了一个简单的字符串串联操作;第二次使用了StringBuilder类。要想查看结果字符串,可以去掉下面的代码中注解行的注解符号:

<%@ Page Language="C#" %>

<script runat="server"> 
void Page_Load(Object Source, EventArgs E) 

int intLimit = 10000; 
DateTime startTime; 
DateTime endTime; 
TimeSpan elapsedTime; 
string strSub; 
string strWhole = "";

// 首先执行字符串连接操作 
startTime = DateTime.Now; 
for (int i=0; i < intLimit; i++) 

strSub = i.ToString(); 
strWhole = strWhole + " " + strSub; 

endTime = DateTime.Now; 
elapsedTime = endTime - startTime; 
lblConcat.Text = elapsedTime.ToString(); 
// lblConcatString.Text = strWhole;

// 使用stringBuilder类进行同样的操作 
startTime = DateTime.Now; 
StringBuilder sb = new StringBuilder(); 
for (int i=0; i < intLimit; i++) 

strSub = i.ToString(); 
sb.Append(" "); 
sb.Append(strSub); 

endTime = DateTime.Now; 
elapsedTime = endTime - startTime; 
lblBuild.Text = elapsedTime.ToString(); 
// lblBuildString.Text = sb.ToString(); 
}

</script>

<html> 
<body> 
<form runat="server">

<h1>String Concatenation Benchmark</h1>

Concatenation: 
<asp:Label 
id="lblConcat" 
runat="server"/>

<br/>

<asp:Label 
id="lblConcatString" 
runat="server"/>

<br/> 
<br/>

StringBuilder: 
<asp:Label 
id="lblBuild" 
runat="server"/>

<br/>

<asp:Label 
id="lblBuildString" 
runat="server"/>

</form> 
</body> 
</html> 
二种方式的差别是相当大的:使用StringBuilder类的Append方法的速度比使用字符串连接的速度快近200倍。比较的结果如下所示: 
(图:picture01)

5、只在必要时使用服务器端控件

ASP.NET中新引入了一种在服务器端运行的被称作Web Server Controls的控件,在代码中,它们经常通过下面的语法被说明:

<asp:TextBox id="txtLastName" size="40" runat="server" /> 
它们有时也被称作ASP控件。服务器端控件是由runat属性指示的,它的值总是“server”。 
通过添加runat属性,一般的HTML控件可以被很方便地转换到服务器端运行,下面是一个简单的例子:

<input type="text" id="txtLastName" size="40" runat="server" /> 
可以通过id属性中指定的名字,我们可以引用程序中的控件,可以通过编程的方式设置属性和获得值,因此,服务器端处理方式有较大的灵活性。

这种灵活性是有一定代价的。每种服务器端控件都会消耗服务器上的资源。另外,除非控件、网页或应用程序明确地禁止view state,控件的状态是包含在view state的隐藏域中,并在每次回送中都会被传递,这会引起严重的性能下降。 
在这方面的一个很好的例子是,网页上控件表格的应用,如果不需要在代码中引用表格中的元素,则使用无需进行服务器端处理的HTML表格。我们仍然可以在HTML表格单元中放置服务器控件,并在代码中引用服务器控件。如果需要引用任意的表格元素,例如指定的单元,则整个表格必须是服务器控件。

6. HyperLink控件、LinkButton控件的差别 

对于Web访问者而言,HyperLink、LinkButton控件是一样的,但它们在功能方面仍然有较大的差异。 
当用户点击控件时,HyperLink控件会立即将用户“导航”到目标URL,表件不会回送到服务器上。LinkButton控件则首先将表件发回到服务器,然后将用户导航到目标URL。如果在“到达”目标URL之前需要进行服务器端处理,则使用LinkButton控件;如果无需进行服务器端处理,则可以使用HyperLink控件。

7、注释代码

这一技巧并不是针对ASP.NET的,但它是一个良好的编程习惯。 
注释不仅仅应当说明代码会执行什么操作,还应当注明原因。例如,不要仅仅在注释中说明是在遍历数组,而是要说明遍历数组是根据某一算法计算一个值,除非算法是相当简单的,否则还应当对算法进行简要的说明。 
.NET工程中的不同的编程语言都有各自不同的注释符号,下面是一个简要的说明: 
HTML <!-- 注释 --> 
JavaScript // 注释 
VBScript ' 注释 
VB.NET ' 注释 
C# // 注释 
/* 多行内容 
的注释 
*/ 
SQL -- 注释

在服务器控件的开始和结束标记中没有注释符号,但服务器能够忽略掉所有它不能识别的属性,因此我们能够通过使用没有定义的属性来插入注释。下面是一个例子:

<asp:TextBox 
id="txtLastName" 
size="40" 
comment="这是我的注释" 
runat="server" /> 
在Visual Studio .NET中对源代码进行注释非常简单。高亮度显示需要注释的行,然后按Ctrl+K+C组合键添加注释。要删除注释,只需高亮度显示被注释的代码,并按下Ctrl+K+U组合键。 
在C#工程中,我们还可以通过在每行的开始处使用///输入XML注释小节。在注释小节中,我们可以使用下面的XML标记组织注释: 
<summary></summary> 
<remarks></remarks > 
<param></param> 
<returns></returns> 
<newpara></newpara> 
要在Visual Studio .NET中查看这些XML注释的格式化的报告,我们可以首先选择“工具”菜单项,然后选择“建立注释Web网页”菜单项。

8、使用trace方法和trace属性记录Page目录中网页的执行情况

调试程序的一种古老的技术是在程序中的关健点插入输出语句,通常情况下,输出信息中会包含重要变量的值,相关信息可以输出到屏幕、日志文件或者数据库。 
在ASP.NET中,通过使用Page命令中的trace属性,这种调试技术的使用更简单了。Page命令是ASPX文件开始处的一行代码,它提供编译器的指示。Page命令中包含一个或多个属性,向编译器提供使用的编程语言、代码支持文件的位置或要继承的类的名字等信息。 
Page命令中的属性之一是trace,其值可能是true或false,下面是一个典型的Page命令,其中的trace属性的值是true:

<%@ Page language="c#" trace="true" %>

如果trace属性的值设置为true,由ASPX文件生成的Web页就会显示出来,除了网页本身外,关于该页的大量其他信息也会显示出来。这些信息以下面小节的形式显示在一张表格中: 
·Request细节 提供Session ID、请求时间和请求的状态码。 
·Trace Information 包含跟踪日志、网页生命周期中按时间先后顺序各个步骤的列表。另外,也可以向其中添加定制信息。 
·控件树 以一种分层次的方式列出网页上的所有控件,包括每个控件以字节计算的大小。 
·Cookies集合 列出该网页创建的所有Cookie。 
·头部集合 HTTP头部以及它们的值。 
·Server变量 与该网页相关的Server环境变量。

包含在Trace Information小节中的跟踪日志是最有用的,在这里我们可以插入自己的跟踪命令。trace类中有2个方法能够在跟踪日志中插入命令:Trace.Write和Trace.Warn,除了Trace.Warn命令用红色字体显示、Trace.Write命令用黑色字体显示外,它们是相同的。下面是跟踪日志的一个屏幕快照,其中包含有几个Trace.Warn命令。

跟踪日志中最方便的功能是我们可以在开发和测试过程中在整个代码中插入Trace.Write和Trace.Warn语句,而在最终交付应用程序时,可以通过改变Page命令中trace属性的值,禁止这些命令起作用,而无需在部署应用软件前删除这些输出语句。

9、使用存储过程

微软公司的SQL Server和其他现代关系数据库都使用SQL命令定义和处理查询。一个SQL语句或一系列SQL语句提交给SQL Server,SQL Server会对命令进行解析,然后创建一个查询计划并对它进行优化,然后执行该查询计划,这都需要大量的时间。 
存储过程是一系列被查询处理器预解析和优化的SQL命令,这些命令会被存储起来,可以得到快速地执行。存储过程也被称作sprocs,它可以接收输入参数,使一个单一的存储过程能够处理较大范围的特定的查询。 
因为sprocs是预先被解析的,对于复杂的查询更显得重要,其查询计划是预先优化的,因此调用查询过程比执行相同功能的SQL语句速度要快得多。

10、使用.NET命令行

.NET命令行工具在命令提示符窗口中运行。为了使命令能够执行,它必须驻留在命令提示符的当前目录中,或通过设置PATH环境变量。 
.NET SDK在“启动”菜单上安装一个菜单项,该菜单项能够打开一个正确设置了PATH环境变量的命令提示符窗口。我们可以通过依次点击“开始”->“程序”->“Microsoft Visual Studio .NET”->“Visual Studio .NET工具”->“Visual Studio .NET命令提示符”,启动命令提示符窗口。 
通过在将该菜单项从菜单上拖到桌面上时,同时按Ctrl+C键,就可以将该菜单项的快捷方式拷贝到桌面上,使用起来会非常方便

(0)

相关推荐

  • asp.net项目开发中用到的小技巧

    1 显示枚举的值:<%# (CN80s.DDPM.Model.Enum.EnumBidCardStatus)(int)Eval("PerpaidCard_Status")%> 2 为下拉框绑定枚举: 复制代码 代码如下: GetEnumList(ddlBids); void GetEnumList(DropDownList ddl) { foreach (EnumBidCardType s in System.Enum.GetValues(typeof(EnumBidCar

  • ASP.NET 2.0 URL映射技巧

    在项目中经常要进行如下映射 将 http://onewww.net/a.aspx?name=llinzzi 映射到 http://onewww.net/llinzzi 首先要解决2个问题 第一是支持通配符的映射 URL映射是asp.net2.0新增的功能,不支持通配符 于是采用了NBEAR的 NBear.Web.Modules.UrlRewriteRules 进行通配符映射 <?xml version="1.0"?> <!--      注意: 除了手动编辑此文件以外

  • asp.net下GDI+的一些常用应用(水印,文字,圆角处理)技巧

    public class MyGDI {     public static void CreateWatermark(string sSrcFilePath, string sDstFilePath, string sText1, string sColor1, string sSize1, string sFont1, string sText2, string sColor2, string sSize2, string sFont2, string sBgColor, string sT

  • ASP.NET常用小技巧

    今天为大家介绍6个ASP.NET常用技巧,使用操作简单,具有很高的实用性,记得收藏哦 1.跟踪页面执行  设置断点是页面调试过程中的常用手段,除此之外,还可以通过查看页面的跟踪信息进行错误排查以及性能优化.ASP.NET中启用页面跟踪非常方便,只需在Page指令中加入Trace="True"属性即可:设置断点是页面调试过程中的常用手段,除此之外,还可以通过查看页面的跟踪信息进行错误排查以及性能优化.ASP.NET中启用页面跟踪非常方便,只需在Page指令中加入Trace="T

  • ASP.NET技巧:教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一个Session,当任务进行到不同的阶段改变Session的值,线程开始的同时使用ShowModalDialog打开一个进度条窗口,不断刷新这个窗口获取Session值,反应出实时的进度.下面就来看看具体的代码:(文章结尾处下载源代码) 先新建一个Default.aspx页面,客户端代码: <body

  • ASP.NET技巧:数据岛出到Excel最为简易的方法

    只需将ContentType 设置为 "application/vnd.ms-excel",表示以Excel方式输出.代码如下:DataToExcel.aspx:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataToExcel.aspx.cs" Inherits="DataToExcel" %> <html xmlns=

  • ASP.NET 后台登录小技巧介绍

    对于后台一些需要登录才能访问的页面,你是不是每次都去判断一下登录时保存在session或者cookie里面的值是否存在啊!假如后台有几十个这样的页面,那么每次都得判断,真心的感到烦,在这里我分享一下我知道的一个解决这个问题的方法吧!呵呵...大牛莫笑,只是想让初学者学习一下学习.NET的童鞋应该都知道吧,我们建的一个Demo.aspx页面都是继承于Page类,如下图:为了达到我们需要的结果,那好,现在我们来新建一个CheckLoginedPage类 :       现在,让我们的 CheckLo

  • 调试ASP.NET应用程序的方法和技巧

    以前使用ASP开发过Web应用程序的人员肯定知道调试Web应用程序是多么麻烦.在ASP中,调试是痛苦的,通常包括了使用Response.Write()方法输出变量的值.那么请问一下自己:你有多少次忘记了在布署应用程序之前删除了调试语句? 随着.NET框架组件的出现这种情况发生了彻底的改变.在.NET中,你可以使用Visual Studio .NET中的调试程序跟踪整个Web应用程序的执行,或者使用System.Web.TraceContext名字空间中的Trace类.本文演示如何使用Trace类

  • ASP.NET User Control使用技巧一则

    User Control在ASP.NET开发中经常用到,如果很多页面都用到同一个User Control的话,那么每个页面都要先用<%@ Register -- %>引入User Control,然后才能使用,这样一来就显得非常麻烦,所以今天教大家一个简单的方法. 首先打开web.config,然后在<system.web>节点中添加如下代码(使用时根据自己情况修改): 程序代码 <pages> <controls> <add tagPrefix=&q

  • ASP.net Textbox的技巧使用

    ①.大家在做Web开发的时候,可能也会遇到之前我所遇到的问题,在使用TextBox控件时,控件的边缘不能被背景图片完全覆盖掉,如图1: 因为Textbox解析后也是html-Text控件,而Text控件是默认有边,即是border:1px solid #000; 所以只要为Textbox控件加上如下的一小句CSS就可以了,即是"border:0px",最后效果如图2: ②.大家在做Web开发时,不知道大家有没有发现,当将Textbox控件的TextMode = "MultiL

  • ASP.NET技巧:为Blog打造个性日历

    日历控件是.net自带的控件之一,功能强大,在很多项目开发中都有用到,对于blog系统来说更是必不可少.纵是好玉也仍需雕琢,为了使它更美观实用,我们还需要对它进行二次开发. 新建一个用户控件,把calender控件拉进来.第一步是外观设置,这个根据你的需要,只需对它的相关属性做一些调整即可.下图是我调整后的界面 属性设置如下: <asp:calendar id="Calendar1" CellPadding="2" Width="160px"

  • 几个 ASP.NET 小技巧

    1. ASP.NET AJAX 中,如何用 JavaScript 调用服务器端的方法? 这里不是指调用简单的 PageMethod,因为静态方法是不能操作当前页面的控件的,所以静态的 PageMethod 作用就跟普通的 WebService 一样,比较局限. 那么,调用一般的服务器端方法,其实就是发起一个异步回调.最简单的实现办法,是通过 UpdatePanel 来做. 首先定义一个隐藏的 LinkButton,在其处理事件中,去调用我们要执行的操作: <asp:LinkButton ID=&qu

  • ASP.NET 小技巧(2个)

    1. ASP.NET AJAX 中,如何用 JavaScript 调用服务器端的方法? 这里不是指调用简单的 PageMethod,因为静态方法是不能操作当前页面的控件的,所以静态的 PageMethod 作用就跟普通的 WebService 一样,比较局限. 那么,调用一般的服务器端方法,其实就是发起一个异步回调.最简单的实现办法,是通过 UpdatePanel 来做. 首先定义一个隐藏的 LinkButton,在其处理事件中,去调用我们要执行的操作: 复制代码 代码如下: <asp:Link

  • ASP.NET技巧:做个DataList可分页的数据源

    这个数据源,分两部分,一是从数据类中调出数据,然后在本数据源中对分页参数以及页面分页辅助控件进行操作!在前面有三个控件控制翻页,一个下拉列表,两个LinkButton! 下面 fill() 方法调用很简单,在页面中要重新绑定的地方 写上 fill() 就可以了,呵呵!但是一定要写哦,例如翻页动作执行后! 下面是db类中的ds方法 public static DataTable ds(string que)    {//返回一个装载了SQL制定留言的数据表,        OleDbConnect

  • Asp.Net性能优化技巧汇总

    本文搜集汇总了Asp.net性能优化的各种技巧,对于Asp.Net开发人员有很好的参考借鉴价值.具体内容如下: 一.选择会话状态存储方式 在Webconfig文件配置: <sessionState mode="???" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

  • ASP.NET技巧:请求网址并解析返回的html

    目的,把远程服务器传回的Html,解析到类里面,为GridView等提供数据源 1 .向远程服务器Post数据 public int PostData(string url, string data, out string info)        {            info = "";            CookieContainer cc = new CookieContainer();            HttpWebRequest request = WebRe

  • asp.net 开发的一些常用技巧

    不使用页面缓存: 你可以在不想被缓存的页面Page_Load事件中加上如下代码 复制代码 代码如下: Response.Expires = 0; Response.Buffer = true; Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1); Response.AddHeader("pragma", "no-cache"); Response.CacheControl = "no-cache&q

  • 几个ASP.NET技巧

    OpenFile Dialog in WebForm 如果需要一个在浏览器端打开文件的OpenFile对话框,可以使用HTML的Input,设置其Type为File: <INPUT style="Z-INDEX: 102; LEFT: 145px; WIDTH: 468px; POSITION: absolute;  TOP: 228px; HEIGHT: 25px" type="file" size="58" id="txtFi

随机推荐