本文主要介绍ASP.NET编程中的一些常用方法,内容涉及代码技巧、性能优化等方面。
1.跟踪页面执行
设置断点是页面调试过程中的常用手段,除此之外,还可以通过查看页面的跟踪信息进行错误排查以及性能优化。ASP.NET中启用页面跟踪非常方便,只需在Page指令中加入Trace="True"属性即可:
2.在服务器端控件中添加客户端属性
我们有时会向服务器端控件中添加一些特殊的属性,这类属性不需要服务器端的处理,只需简单的发送至客户端即可,我们不妨称其为客户端属性,例如HTML属性或自定义属性(可能用于实现某种特定的JavaScript功能)。可以通过以下几种方法达到这个目的:
a.直接向控件添加客户端属性
其中的onmouseover是客户端属性,注意,编译器是允许这种写法的,但会显示警告。
b.调用内置方法
可以通过调用WebControl.Attributes.Add()方法为控件添加客户端属性,如下所示:
这也是最常用的方法。
c.创建自定义控件
如果某个类型的服务器端控件中经常需要添加客户端属性,则可以考虑创建一个继承自该服务器端控件的自定义控件,其中包含特定的客户端属性。
正是考虑到这一点,ASP.NET 2.0中为按钮控件(包括Button、LinkButton、ImageButton控件)提供了OnClientClick属性,可以这样写:
真是贴心的功能!
3.表单数据的服务器端验证
将数据验证任务从服务器端迁移到客户端的过程促使了JavaScript的产生,这也是我们沿用至今的一种方式。但只有在保证客户端JavaScript正常运行的前提下,这种方式才能发挥其作用。不幸的是,总有一些例外,比如浏览器不支持JavaScript,或者用户刻意关闭了浏览器的JavaScript功能,这就导致了第一重防护失效。比较保险的做法是加入第二重防护,即对用户提交的数据进行服务器端验证,但这无疑将增加开发者的工作量。
ASP.NET 2.0提供了一系列表单数据验证控件,可以非常轻松的完成客户端及服务器端的双重数据验证任务。但要使服务器端验证功能发挥作用,还需要用到Page.IsValid属性,请看下面的例子:
这是一个HTML片段,其中有一个RequiredFieldValidator控件用于检查是否已填写姓名。下面是点击按钮时执行的服务器端代码:
其中,要特别注意对Page.IsValid属性的判断,只有页面中所有验证控件对数据的验证都成功时,Page.IsValid属性才为True,这代表提交的数据为有效数据,可以进入下一步操作。
4.跳过表单验证
在某些情况下,我们需要跳过表单中所有控件的验证,然而在另外一些情况下,我们却希望有选择的触发表单中某些控件的验证功能。分别来看看这两种情况:
a.跳过所有验证
假设有个表单,其中除了各种数据录入控件外还有两个按钮,一个是提交按钮,另一个是取消按钮,同时表单中还有一些数据验证控件。我们希望当点击取消按钮的时候无需验证表单中数据的有效性,而是直接将页面提交至服务器并将其重定向到某个指定页面。
要实现这个功能,可以利用按钮控件(包括Button、LinkButton、ImageButton控件)的CausesValidation属性,将该属性设为false即可跳过表单中的所有验证。
b.触发某些验证
假设有个表单,被划分成两个功能区,一个用于用户登录,另一个用于用户注册,我们希望当点击登录按钮时只触发登录区的数据验证,当点击注册按钮时只触发注册区的数据验证。
解决办法是将相关的数据验证控件和数据提交控件(按钮控件)加入同一个验证组,这一点是通过将各相关控件的ValidationGroup属性设为相同的值来实现的。
5.保持滚动条位置
假设有个页面,其中以列表形式显示了一些数据记录,每次编辑其中的记录时都需要向服务器提交页面,为了提供良好的用户体验,我们希望每次编辑一条记录并保存后,滚动条位置都能保持不变。传统的做法是每次提交页面时将当前滚动条所在位置信息按某种方式(Hidden字段或QueryString)传给服务器端,当页面返回客户端时,由服务器端根据传入的位置信息以JavaScript形式重新设置滚动条位置。
如果通过ASP.NET来实现这一功能将变得非常简单,只需在Page指令中加入MaintainScrollPositionOnPostback="true"属性即可:
6.禁用不必要的ViewState
在ASP.NET的运行机制中,ViewState起着重要的作用。ViewState经过编码后存入表单Hidden字段,每当页面回传至服务器时再进行解码。因此,ViewState的使用会带来两个问题:带宽的占用以及计算资源的消耗。好在不是所有控件都需要启用ViewState,我们完全可以禁用不必要的ViewState。
ViewState默认是开启的,需要手动关闭:
a.禁用页面ViewState
在Page指令中加入EnableViewState="false"属性即可:
加入这个属性后,整个页面以及其中的所有控件都将无法使用ViewState,因此需谨慎使用。
b.禁用控件ViewState
这是推荐的方式,将控件的EnableViewState属性设为False即可禁用其ViewState,这里有个简单的窍门:
如果某个控件的状态不能由操作者改变,则可以禁用其ViewState。最典型的莫过于Label控件了,只能显示信息,无法操作。
但TextBox、DorpDownList等控件的状态是可以改变的(通过输入、选择等操作),因此保留他们的ViewState还是有用的。
---------------------------
1. 在提交页面之后,保持滚动条的位置
可以在page指令上加上MaintainScrollPositionOnPostback指令
<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeFile="..." Inherits="..." %>
2. 在页面载入完之后,将焦点移动到某个控件,只需要指定Form的DefaultFocus属性就可以了。
<form id="frm" DefaultFocus="txtUserName" runat="server">
...
</form>
3. 通过DefaultButton属性设置form的默认相应按钮,即在用户敲回车时触发的按钮
<form id="frm" DefaultButton="btnSubmit" runat="server">
...
</form>
4. 可以使用$符号轻松的使用FindControl方法找到控件
<form id="form1" runat="server" DefaultFocus="formVw$txtName">
<div>
<asp:FormView ID="formVw" runat="server">
<ItemTemplate>
Name:
<asp:TextBox ID="txtName" runat="server"
Text='<%# Eval("FirstName") + " " + Eval("LastName") %>' />
</ItemTemplate>
</asp:FormView>
</div>
</form>
在上面的例子中使用form的DefaultFocus属性指定页面载入时焦点所在的控件,使用$符号就可以轻松的定位txtName
也可以使用以下代码来轻松的找到控件
TextBox tb = this.FindControl("form1$formVw$txtName") as TextBox;
if (tb != null)
{
//Access TextBox control
}
5. 关于跨页提交的取得发出提交页面控件强类型的方法,见原文
6. 使用强类型访问MasterPage属性成员的方法,见原文
7. 我们可以使用验证控件的属性 ValidationGroup 指定该验证控件所属组,同时在button的ValidationGroup属性中指定该button所需要激活的验证组。
<form id="form1" runat="server">
Search Text: <asp:TextBox ID="txtSearch" runat="server" />
<asp:RequiredFieldValidator ID="valSearch" runat="Server"
ControlToValidate="txtSearch" ValidationGroup="SearchGroup" />
<asp:Button ID="btnSearch" runat="server" Text="Search"
ValidationGroup="SearchGroup" />
....
Other controls with validators and buttons defined here
</form>