本文讲述了如何给Web页面添加一个服务器端控件,从而将用户的浏览器重定向到该控件所指向的页面(referring page)。
by Juval Lowy

Q:实现一个ASP.NET Back控件
我想在ASP.NET页面中添加一个链接,通过他,我能够返回到他所指向的页面。不知怎样用一个服务器端控件来实现他呢?我想通过该控件返回到已访问过的页面,而并不想用浏览历史记录的方法。

A:
您能够用两种方法在一个Web页面上实现一个“Back”链接。第一种方法是用客户端脚本读取前面已访问过的页面的记录,并将他重定向到前一个页面:

<a href= "javascript:history.back()">Back</a>


但是这种方法有几个缺点。应用程式不能控制用户被重定向到了哪里。通常情况下,您总是想让用户留在应用程式内,而不想让他们跑到其他页面。只有当浏览器支持客户端脚本时,这种方法才可行。其最大的缺点就是他和ASP.NET编程模式不一致。ASP.NET的一个最大的好处就是他不同于传统的ASP,他无需您依赖于客户端脚本。您只需要知道如何使用您用托管代码写的服务器端控件就行了,ASP.NET会为您完成其他的工作。在使用客户端脚本时,Back链接和应用程式的其他部分是没有关系的,他是在服务器上运行的,并运用了服务器端的控件。这会使您很难控制是否激活Back链接,而且您也很难控制重定向,因为他们都是以服务器端事件处理程式为基础的。

第二种方法是用一个ASP.NET自定义的用户控件。本文所附带的源文档在WebControlsEx类库程式集中包含一个BackLink ASP.NET用户控件。假如要用该控件,您需要右击Web Forms工具箱,从弹出的上下文菜单中选择Add/Remove Items。点击.NET Frameworks Components Tab键并按Browse按钮。选择WebControlsEx程式集,点Open。这样就在toolbox上添加了BackLink用户控件。您只需要将他拖放到您的form中,就能够添加一个链接式的控件了,其text属性是“Back”。在设计时,该控件具备和标准的链接按钮相同的属性,如链接样式(见图1)。当用户在运行时点击该按钮时,他会将浏览器引导到前一个页面(假如有的话)。

实现BackLink用户控件并不像我们所看到的那么简单。要构建一个Web用户控件,您必须用DLL类库。您能够通过两种方法来提供一个用户控件:继承一个叫做WebControl的类并对他进行自定义,或继承一个现有的控件并进行自定义。对于BackLink控件来说,现在一个比较好的方法就是继承一个LinkButton,因为LinkButton控件提供了大部分很难实现的功能。

您能够从LinkButton继承一个叫做BackLink的类,在他的构造器中将Text属性配置为Back,并提供一些有意义的缺省值:

public class BackLink : LinkButton
{
public BackLink()
{
Text = "Back";
}
}


实际上,继承一个LinkButton在HTML中能够体现出来。通过继承BackLink,该控件在设计器中能够体现LinkButton任何的属性——如缺省的属性、字体配置属性和事件。

LinkButton有一个叫做OnClick()的受保护的虚拟方法,当返回页面时,.NET会调用该方法,让链接按钮触发点击事件。LinkButton必须覆盖OnClick()并将用户重定向到控件所指向的页面。

重要的问题是在BackLink控件范围内,如何在服务器端得到当前页面所指向的页面。幸运的是,ASP.NET具备这样的功能:HttpRequest对象提供了一个Url类型的公开的属性,称为UrlReferrer,他表示的是所指向页面的URL。LinkButton用户控件能够得到对页面的引用,这是通过Control类的Page属性实现的。Control是WebControl的基类,WebControl是LinkButton的基类。该控件也能够用Page属性来读取其HttpResponse对象(Response属性),从而将用户重定向到所指向的页面。

然而,假如您用下面的代码来实现BackLink控件,那么该链接会不起作用:public class BackLink : LinkButton
{
public BackLink()
{
Text = "Back";
}
protected override void
OnClick(EventArgs e)
{
Uri backURL =
Page.Request.UrlReferrer;
Page.Response.Redirect(
backURL.AbsoluteUri);
}
}


原因在于ASP.NET跟踪所指向页面的方式。例如,我们以Home.aspx页面为例,他会将用户引导到SubForm.aspx页面。假如SubForm.aspx页面有一个BackLink控件,用户点击该链接后,就会触发返回页面到服务器的事件。服务器上UrlReferrer属性的值是“SubForm.aspx”(而不是“Home.aspx”),因为当返回页面时,SubForm.aspx指向的是他自己。解决方法就是在加载控件时,在session变量中缓存所指向的页面,并在OnClick()中重定向到所指向的页面。

现在,您还需要解决几个问题:ASP.NET并不是总能提供具备导向信息的页面的,在这种情况下,ASP.NET将UrlReferrer的值配置为空。您也需要提供一个“智能的”Back链接,他能够重定向到逻辑上的前一个页面。换句话说,假如一个包含BackLink的页面自己重载(在处理了一些控件的点击事件后),Back链接应该能够很“聪明”地检测到这一点,并重定向到“真实”的前一个页面,而不是他本身。注意,假如您用客户端代码,这是不可能实现的,因为在再次载入时,Back记录变量会呈现同样的页面。

BackLink覆盖了其基类的OnLoad()方法(见列表1)。当加载包含BackLink控件的页面时,调用OnLoad()。OnLoad()首先查看是否有所指向的页面信息。假如UrlReferrer是空的,那么OnLoad()就会让Back链接不起作用。假如有导向信息,您需要验证所指向的页面不是当前页面。您能够通过比较所指向页面的URL和请求页面的URL来实现这一点:

if(backURL.AbsolutePath != Page.Request.Url.AbsolutePath)

假如两个URL不相同,BackLink就把所指向页面的URL保存在一个session变量中:

Page.Session["Referring URL"] = backURL;

然后他会激活该控件。假如地址是相同的,BackLink在激活控件前,需要验证所指向页面的URL是否已缓存过了。在OnClick()中,您必须读取session变量,假如session变量存在,就将用户重定向到控件指向的页面。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!