2013年5月11日

ASP.NET網頁間轉址和傳值方式

這是一個網友常問的問題,網頁間轉換時的傳值方式,先談談網頁間的Navigation(導覽 或轉址),畢竟要先轉址才有辦法傳值吧;這邊範例是Source.aspx要轉到Target.aspx,有以下幾種轉址方式:
轉址
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 Pages

Page.PreviousPage Property

ASP.NET傳值的3個方法 (Response.Redirect、Server.Transfer、Server.Execute)

Cross Page Postback in ASP.Net 2.0

1 則留言:

  1. 想請問一下 如果用sever.transfer 導入下一個網頁 但下一個網頁的顯示方式想以分頁的方式顯示的話 該怎麼加呢?

    回覆刪除