2012年2月5日 星期日

ASP.NET 使用MasterPage跨網頁傳遞參數問題

一般跨網頁傳遞參數,很簡單到很多書都不講,大致有五種方法。
以送出頁為SendToB.aspx,接收頁為RecvFromA.aspx為例。

1.透過Http Html Form Get:
    送出頁:Response.Redirect("~/RecvFromA.aspx?id=" + TextBox1.Text);
    接收頁:string sId = Request.QueryString["id"];
    ◎通用性最佳,但不宜傳送可能有資訊安全疑慮之參數,且要注意參數編碼與轉碼問題。

2.透過Http Html Form Post:
    送出頁:Response.Redirect("~/RecvFromA.aspx"); 或使用 Button的PostBackUrl屬性填入~/RecvFromA.aspx。
    接收頁:string sId = Request.Form["id"];
    ◎通用性次佳,但在Master Page下無效。

3.透過ASP.NET PreviousPage:
    送出頁:Response.Redirect("~/RecvFromA.aspx"); 或使用 Button的PostBackUrl屬性填入~/RecvFromA.aspx。
    接收頁: TextBox oTB = (TextBox)this.PreviousPage.FindControl("TextBox1");
                     this.Label1.Text = oTB.Text;
    ◎只能用於本身且是ASP.NET網站。在Master Page下需要修改程式碼。

4.透過ASP.NET PreviousPage加自訂公用屬性:
    送出頁:先在Class內加上自訂公用屬性。
                  public String SearchString
                  {
                       get
                      {
                           return  TextBox1.Text;
                      }
                   }
                    再使用 Button的PostBackUrl屬性填入~/RecvFromA.aspx 。
    接收頁:將RecvFromA.aspx頁面的第一列後插入以下指令列,<%@ PreviousPageType VirtualPath="~/SendToB.aspx" %>
                    接著在RecvFromA.cs的Page_Load()函式中使用Label1.Text = PreviousPage.SearchString; 取得前頁公用屬性。
    ◎ 只能用於本身且是ASP.NET網站 ,且送出頁與接收頁無法二對一傳遞。不論一般跨網頁或Master Page下都不需要修改程式碼。

5.透過ASP.NET Session傳遞
    送出頁:使用 Button的onClick事件填入Session["SearchString"] = TextBox1.Text;
                    Response.Redirect("~/RecvFromA.aspx");
    接收頁:Page_Load()函式中使用Label1.Text =  Session["SearchString"].ToString();
    ◎ 只能用於本身且是ASP.NET網站,簡單好用跟寫 AP 觀念一樣。

但是,若使用MasterPage跨網頁傳遞參數,第一種方法可以,第二種方法會抓不到,第三種方法則接收頁需要修改語法如下,第四種方法可以,第五種方法可以。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.PreviousPage != null)
        {
            if (PreviousPage.IsCrossPagePostBack)
            {
                //使用MasterPage時, 使用此語法來查找到前一頁中Content Page內的控制項
                TextBox oTB = (TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");
             
                //使用MasterPage時, 使用此語法來查找到前一頁中Master Page內的控制項
                //TextBox oTB = (TextBox)this.PreviousPage.Master.FindControl("TextBox1");
             
                //顯示上頁欄位中傳遞過來的參數
                this.Label1.Text = oTB.Text;
            }
        }
    }

---
Welly

沒有留言:

張貼留言