国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

實現一個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技術!
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 南安市| 辰溪县| 栖霞市| 渝中区| 达尔| 乃东县| 鄄城县| 岐山县| 平潭县| 饶平县| 洛隆县| 泾川县| 慈溪市| 黄骅市| 广平县| 东乌珠穆沁旗| 商河县| 濮阳县| 勃利县| 天气| 乳源| 石楼县| 临沭县| 开化县| 贡嘎县| 嘉峪关市| 丁青县| 日土县| 南投县| 藁城市| 宣化县| 林西县| 都匀市| 揭东县| 古交市| 隆昌县| 军事| 东乡县| 旺苍县| 当雄县| 鸡东县|