Asp.Net頁面之間傳值

來源:互聯網
上載者:User

一. 使用QueryString變數
QueryString是一種非常簡單也是使用比較多的一種傳值方式,但是它將傳遞的值顯示在瀏覽器的地址欄中,如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法。

         Response.Redirect( "target.aspx?param1=hello&param2=hi ")
接收頁面:   string   str   =   Request.QueryString["param1"];
string   str1   = Request.QueryString["param2];
二.使用Cookie物件變數(Cookie是存放在用戶端的)
設定Cookie:   HttpCookie cookie_name = new HttpCookie("name");
cookie_name.Value = Label1.Text;
Reponse.AppendCookie(cookie_name);

擷取Cookie:
string name= Request.Cookie["name"].Value.ToString();

三. 使用Session變數(session是存放在伺服器端的)
設定Session:      Session["name"] ="hello";
擷取Session:        string name = Session["name"].ToString();
四.使用Application 物件變數
Application對象的作用範圍是整個全域,也就是說對所有使用者都有效。此種方法不常使用,因為Application在一個應用程式定義域範圍共用,所有使用者可以改變及設定其值,故只應用計數器等需要全域變數的地方。
設定Application :    Application["name"] = ="hello";
擷取Application :     string   name = Application["name"].ToString();
五. PostBackUrl()方法
default.aspx頁面:

Code
1 <asp:Button ID="Button1" Runat="server" Text="PostToAnotherPage" PostBackUrl="~/Default2.aspx" />
2
default2.aspx頁面:

Code
1 if (PreviousPage != null)
2        {
3            TextBox textBox1 = (TextBox)PreviousPage.FindControl("TextBox1");
4           Response.write(textBox1.Text );
5        }

六.使用Server.Transfer方法
這個才可以說是面象對象開發所使用的方法,其使用Server.Transfer方法把流程從當前頁面引導到另一個頁面中,新的頁面使用前一個頁 面的應答流,所以這個方法是完全面象對象的,簡潔有效。下面這個代碼是展示在需要很多個參數的時候,使用的方法,如果參數比較少就沒必要使用這個方法了.
如果讓所有的查詢頁面都繼承一個介面,在該介面中定義一個方法,該方法的唯一作用就是讓結果頁面獲得構建結果時所需的參數,就可實現多頁面共用一個結果頁面操作!

1、先定義一個類,用該類放置所有查詢參數:

Code
/**//// <summary>
/// QueryParams 的摘要說明
/// </summary>
public class QueryParams
{
private   string   firstName;
private   string   lastname;
private   int    age;

         public string Firstname
{
get { return this.firstname; }
set { this.firstname = value; }
}
public string LastName
{
get { return this.lastname; }
set { this.lastname = value; }
}
public string Age
{
get { return this.age; }
set { this.age = value; }
}

}

2、介面定義:

Code
/**////   <summary >
///   定義查詢介面。
///   </summary >
public interface IQueryParams
{
/**////   <summary >
///   參數
///   </summary >
QueryParams Parameters { get;}
}

     3、查詢頁面繼承IQueryParams介面(QueryPage.aspx):
QueryPage.aspx

Code
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>
<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>
<asp:TextBox ID="txtAge" runat="server"></asp:TextBox>
<asp:Button ID="btnEnter" runat="server" Text="Button" OnClick="btnEnter_Click" /></div>
</form>

QueryPage.aspx.cs

Code
public partial class QueryPage : System.Web.UI.Page, IQueryParams
{
private QueryParams queryParams;

public   QueryParams   Parameters
{
get
{
return   queryParams;
}
}

public   void   btnEnter_Click(object   sender,   System.EventArgs   e)
{
//賦值
queryParams   =   new   QueryParams();
queryParams.FirstnName = this.txtFirstName.Text;
queryParams.Lastname = this.txtLastName.Text;
queryParams.Age = this.txtAge.Text;
Server.Transfer( "ResultPage.aspx ");
}

    protected void Page_Load(object sender, EventArgs e)
{ }
}
4、接收頁面(ResultPage.aspx):
ResultPage.aspx.cs
public partial class ResultPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
QueryParams queryParams = new QueryParams();
IQueryParams queryInterface;
//實現該介面的頁面
if (Context.Handler is IQueryParams)
{
queryInterface = (IQueryParams)Context.Handler;
queryParams = queryInterface.Parameters;
}

        Response.Write("FirstName: ");
Response.Write(queryParams.FirstName);
Response.Write(" <br/ >Lastname: ");
Response.Write(queryParams.LastName);
Response.Write(" <br/ >Age: ");
Response.Write(queryParams.Age);

    }
}

1、在CallBack之後保持捲軸的位置

在Asp.Net1.1中,CallBack之後保持捲軸的位置是一件非常痛苦的事情,特別是頁中有一個Grid 並且想要編輯特定的行。為了不停留在想要得行,頁面會重新載入並且必須在頂部向下滾動。在Asp2.0中,只需要簡單的在頁面的屬性中加入 MaintainScrollPostionOnPostBack屬性即可:

<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeFile="" Inherits="" %>

2、頁面載入後設定預設焦點到控制項上

這也是一個非常簡單的例子,不需要javascript的輔助即可完成。如果在頁面中有一兩個textbox,為什 麼要讓使用者去點擊textbox來開始輸入資料呢?是不是可以能夠讓游標已經停留在textbox進而可以輸入資料呢?使用HtmlForm控制項的 DefaultFocus屬性就可以輕易的做到:

<form id="frm" DefaultFocus="txtUserName" runat="server">

</form>

3、使用者點擊“Enter”鍵時觸發預設按鈕的click實踐。

在Asp1.1中,想要使使用者點擊“Enter”鍵就能關聯到一個button的伺服器段的click事件需要藉助 於javascript,這是很痛苦的。幸好,現在可你使用HtmlForm控制項的DefaultButton屬性來設定。這個屬性也可以設定到 Panel控制項上,當使用者移動到頁面中不同的Panel上,點擊enter鍵來觸發不同的button控制項的click事件。

   <form id="frm" DefaultButton="btnSubmit" runat="server">

</form>

4、簡單的尋找固定的控制項。

在頁面的控制項中按層次尋找控制項很痛苦,但是如果你知道控制項怎樣固定在頁面中,就可以用簡寫”$”來尋找控制項而不用寫遞迴的代碼。請看下面代碼,注意”$”的使用:

<form id="form1" runat="server" DefaultFocus="formVw$txtName">
<div>
<asp:FormView ID="formVw" runat="server">
<ItemTemplate>
Name:
<asp:TextBox ID="txtName" runat="server"
Text='<%# Eval("FirstName") + " " + Eval("LastName") %>' />
</ItemTemplate>
</asp:FormView>
</div>
</form>

這個小技巧也可以用在伺服器端的 使用FindControl()函數時:

TextBox tb = this.FindControl("form1$formVw$txtName") as TextBox;
if (tb != null)
{
//Access TextBox control
}

5、強型別訪問跨頁提交的控制項

這個比其他的要內容多一點,但是很有用。ASP.NET 2.0引入了交叉回傳的概念使得一個頁面可以將資訊回傳到另一個不同的頁面,可以將button控制項的PostBackUrl屬性設定為接受回傳資料的頁 面來完成。一般的,回傳的資料可以象前一頁那樣做一些事情。但是,如果你要獲得前一頁制定控制項的屬性就需要一個cast(),如果你給引起回傳的 code-behide頁面添加了一個公用屬性,你就可以直接以強型別的方式添加PreviousPageType來指向引起回傳的頁面從而能夠訪問那個 屬性。

如果有一個頁面Default.aspx,他有一個公用屬性來返回此頁面上一個TextBox,資料回傳目的頁(SearchResults.aspx)可以以強型別的方式(不需要FindControl() 方法),在頁面的頂部添加:

<%@ PreviousPageType VirtualPath="Default.aspx" %>

這樣,SearchResults.aspx中代碼就可以以強型別的方式訪問Default.aspx的TextBox。下面的例子假定Default.aspx定義的屬性名稱為SearchTextBox:

TextBox tb = PreviousPage.SearchTextBox; PreviousPageType還有一個TypeName屬性,你可以定義一個基本類型,一個或多個頁面從此類型繼承下來,使得這種技術可以在多頁面上使用。

PreviousPage.IsCrossPagePostBack可以判斷是否為垮頁提交。

對於跨頁提交的補充:

在ASP.NET 1.X 版本中,頁面都是提交到自己本身,並不能方便的指定需要提交的目的頁面。例如FirstPage.aspx中的button只能提交到 FirstPage.aspx,而不能提交到SecondPage.aspx。很多時候,ASP.NET 1.X這樣工作方式使我們的開發方式受到不少限制。熟悉ASP/JSP/PHP的朋友大概很不習慣,因為以前經常使用的提交方式突然無法使用,雖然也有解 決這個問題的方法(欲詳細瞭解的讀者可去微軟網站收看webcast),可是過程太煩瑣,不甚方便。令我們高興的是,ASP.NET 2.0中有了跨頁面提交的簡單方法。可在第一個頁面中的button添加PostBackUrl屬性設定為接受提交的頁面,並且這個頁面增加 PreviousPageType 指令,若要是目標頁面在新視窗中開啟則可以在源頁面<form>標記增加target=’_blank’屬性。

6、強型別訪問主版頁面的控制項

PreviousPageType指令並不是唯一的可以強型別訪問控制項的方法。如果在主版頁面中定義了一個公用屬性, 並且想要以強型別的方式訪問它,那麼就可以在頁面頂部添加MasterType指令(注意:MasterType指令同PreviousPageType 一樣允許定義一個TypeName)

<%@ MasterType VirtualPath="MasterPage.master" %>

你可以在內容頁書寫如下的代碼來訪問目標主版頁面的屬性:

this.Master.HeaderText = "Label updated using MasterType directive with VirtualPath attribute.";

7、Validation groups驗證組

一個頁中可能有多個控制項和多個按鈕。當其中的一個按鈕被點擊後想要特定的validator被激發而不是頁面中的所 有validator。在ASP.NET 1.1中除了hack code沒有更好的辦法。ASP.NET 2.0中給所有的validator控制項和按鈕(button、linkbutton等等)增加了ValidatorGroup屬性,就可以輕鬆地解決這 個問題。如果在頁面中有一個TextBox並且緊挨著他有一個RequiredFieldValidator 和Button控制項,可以將RequiredFieldValidator和Button的ValidationGroup屬性設定成一樣的值從而使得點 擊button時只觸發這個RequiredFieldValidator的validor,任何沒有定義在ValidationGroup內的其他的 validator都會被忽略。看下例:

<form id="form1" runat="server">
Search Text: <asp:TextBox ID="txtSearch" runat="server" />
<asp:RequiredFieldValidator ID="valSearch" runat="Server"
ControlToValidate="txtSearch" ValidationGroup="SearchGroup" />
<asp:Button ID="btnSearch" runat="server" Text="Search"
ValidationGroup="SearchGroup" /> .
Other controls with validators and buttons defined here
</form>

 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.