轉址
1. Hyperlink轉址
你可以使用以下方式
A. Client轉址
Source.aspx裡放一個HTML Hyperlink
<form>
…
<a href=”target.aspx”>轉到Target.aspx</a>
B. ASP標籤 <form>
…
<asp:HyperLink ID="Hyp" runat="server" NavigateUrl="~/target.aspx">here</asp:HyperLink>
2. Client Redirect
顧名思議也是Client端的轉址,只不過程式碼是寫在Server端的code behind
3. Server Transfer
顧名思議是Server端的轉址,程式碼也是寫在Server端的code behind
protected void Button2_Click(object sender, EventArgs e) { Server.Transfer("Target.aspx"); }
那Redirect和Transfer不同點是:
A. Redirect必需先Response回到Client端,才會轉址到Target.aspx,而Transfer則直接轉到Target.aspx
B. Response.Redirect可以跨越不同的WebSite;Server.Transfer則只能在同一個WebSite中
C. Response.Redirect會顯示轉址後的網址,我們這邊會變成target.aspx;Server.Transfer則會保留本來的網址,這裡是Source.aspx,所以如果source.aspx後有帶querystring,便不會消失
了解了轉址的方式式後,接著說明傳值的方式。
傳值
1. QueryString
就是在網址後帶參數,如下
Source.aspx
<form>
…
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="Target.aspx?show=Hyperlink">HyperLink</asp:HyperLink>
Target.aspx.cs
if (Request.QueryString["show"] != null) { lblShow.Text = Request.QueryString["show"].ToString(); }
2. Session
作法是在Source.aspx的code behind,設定一個Session變數,把要存的值或物件放進去,轉址到Tartget.aspx時,就可以直接取出來用
Source.aspx.cs
protected void btnSession_Click(object sender, EventArgs e) { Session["show"] = "Session值"; Server.Transfer("Target.aspx", true); }
target.aspx .cs
if (Session["show"] != null) lblSession.Text = Session["show"].ToString();
雖然Session很好用,可是盡量是不要用,預設是Inproc,因為他會佔記憶體,過度使用會造成IIS 記憶體不足;此外,Session在不同網站是無法使用的,不同的Web Server當然多說,一定使用不同 Session,那在同一台Server不同站台呢?其實也沒辦法讀取彼此的Session,因為分屬不同Process,這可利用Process間分享記憶體來解決這問題,這是另一個議題,不在此討論。
3. PreviousePage的控制項
如果用Transfer轉址Target.aspx就可以讀取Source上的元件,這要借重PreviousPage
Source.aspx.cs
protected void btnTransfer_Click(object sender, EventArgs e) { Server.Transfer("Target.aspx", true); }
Target.aspx.cs
有使用Masterpage
if (PreviousPage != null) { Control placeHolder = PreviousPage.Controls[0].FindControl("MainContent"); TextBox txt = (TextBox)placeHolder.FindControl("txtPass"); if (txt != null) lblShow.Text = Server.HtmlEncode(txt.Text); else lblShow.Text = "[Name Not available]"; } else { lblShow.Text = "cannot find previous page"; }
沒使用Masterpage
if (PreviousPage != null) { TextBox txt = (TextBox)(PreviousPage .FindControl("txtPass"); if (txt != null) lblShow.Text = Server.HtmlEncode(txt.Text); else lblShow.Text = "[Name Not available]"; } else { lblShow.Text = "cannot find previous page"; }
以上是差在有Masterpage要先找到Place Hoder元件,在往下找Textbox元件
4. PreviousePage 類別成員
Source.aspx.cs裡放一個Property,讓Target.aspx.cs來讀取
public string show { get { return txtPass.Text; } }
Target.aspx最前面要放@PreviousPageType
<%@ PreviousPageType VirtualPath="~/Source.aspx" %>
Target.aspx.cs
if (PreviousPage != null) { lblPreviousProperty.Text = PreviousPage.show; }
參考
How to: Pass Values Between ASP.NET Web PagesPage.PreviousPage Property
ASP.NET傳值的3個方法 (Response.Redirect、Server.Transfer、Server.Execute)
Cross Page Postback in ASP.Net 2.0
想請問一下 如果用sever.transfer 導入下一個網頁 但下一個網頁的顯示方式想以分頁的方式顯示的話 該怎麼加呢?
回覆刪除