实现一个Asp.net自定义Back控件
2024-07-10 12:56:29
供稿:网友
本文讲述了如何给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变量存在,就将用户重定向到控件指向的页面。
你也可以在可视化设计页面上设计用户控件。当你将控件拖放到web form时,toolboxdata属性会告诉vs.net在aspx文件中插入什么。toolboxbitmap包含对控件图标的一个引用(以嵌入资源的形式)。如图1所示,一旦你添加了控件,图标就会显示在toolbox中。
源代码:
[toolboxdata("<{0}:backlink runat=server></{0}:backlink>")]
[toolboxbitmap(typeof(backlink),"backlink.bmp")]
public class backlink : linkbutton
{
public backlink()
{
text = "back";
tooltip =
"click to go to the previous page";
}
protected override void onclick(eventargs e)
{
uri backurl = (uri)page.session[
"referring url"];
page.session["referring url"] = null;
if(backurl != null)
{
page.response.redirect(
backurl.absoluteuri);
}
}
protected override void onload(eventargs e)
{
uri backurl = page.request.urlreferrer;
if(backurl == null) //no referrer
information
{
enabled = false;
return;
}
if(backurl.absolutepath !=
page.request.url.absolutepath)
{
page.session["referring url"] =
backurl;
enabled = true;
return;
}
else
{
object obj = page.session[
"referring url"];
if(obj != null)
{
enabled = true;
}
}
base.onload(e);
}
}
网站运营seo文章大全提供全面的站长运营经验及seo技术!