Asp.net頁面傳值方法及實用技巧

 
一. 使用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方法把流程從當前頁面引導到另外一個頁面中,新的頁面使用前一個頁面的應答流,因此這個方法是徹底面象對象的,簡潔有效。下面這個代碼是展現在須要不少個參數的時候,使用的方法,若是參數比較少就不必使用這個方法了.
若是讓全部的查詢頁面都繼承一個接口,在該接口中定義一個方法,該方法的惟一做用就是讓結果頁面得到構建結果時所需的參數,就可實現多頁面共享一個結果頁面操做!
一、先定義一個類,用該類放置全部查詢參數:

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; }
        }
}
二、接口定義:

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

     三、查詢頁面繼承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)
    { }
}
四、接收頁面(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);
    }
}
一、在CallBack以後保持滾動條的位置
在Asp.Net1.1中,CallBack以後保持滾動條的位置是一件很是痛苦的事情,特別是頁中有一個Grid而且想要編輯特定的行。爲了避免停留在想要得行,頁面會從新加載而且必須在頂部向下滾動。在Asp2.0中,只須要簡單的在頁面的屬性中加入MaintainScrollPostionOnPostBack屬性便可:
<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeFile="" Inherits="" %>
二、頁面加載後設置默認焦點到控件上
這也是一個很是簡單的例子,不須要javascript的輔助便可完成。若是在頁面中有一兩個textbox,爲何要讓用戶去點擊textbox來開始輸入數據呢?是否是能夠可以讓光標已經停留在textbox進而能夠輸入數據呢?使用HtmlForm控件的DefaultFocus屬性就能夠輕易的作到:
<form id="frm" DefaultFocus="txtUserName" runat="server">
</form>
三、用戶點擊「Enter」鍵時觸發默認按鈕的click實踐。
在Asp1.1中,想要使用戶點擊「Enter」鍵就能關聯到一個button的服務器段的click事件須要藉助於javascript,這是很痛苦的。幸虧,如今可你使用HtmlForm控件的DefaultButton屬性來設置。這個屬性也能夠設置到Panel控件上,當用戶移動到頁面中不一樣的Panel上,點擊enter鍵來觸發不一樣的button控件的click事件。
   <form id="frm" DefaultButton="btnSubmit" runat="server">
    
   </form>
四、簡單的尋找固定的控件。
在頁面的控件中按層次尋找控件很痛苦,可是若是你知道控件怎樣固定在頁面中,就能夠用簡寫」$」來查找控件而不用寫遞歸的代碼。請看下面代碼,注意」$」的使用:
<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
}
五、強類型訪問跨頁提交的控件
這個比其餘的要內容多一點,可是頗有用。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’屬性。
六、強類型訪問母版頁的控件
PreviousPageType指令並非惟一的能夠強類型訪問控件的方法。若是在母版頁中定義了一個公共屬性,而且想要以強類型的方式訪問它,那麼就能夠在頁面頂部添加MasterType指令(注意:MasterType指令同PreviousPageType同樣容許定義一個TypeName)
<%@ MasterType VirtualPath="MasterPage.master" %>
你能夠在內容頁書寫以下的代碼來訪問目標母版頁的屬性:
this.Master.HeaderText = "Label updated using MasterType directive with VirtualPath attribute.";
七、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>
 
本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/guopengzhang/archive/2009/10/25/4726314.aspx
相關文章
相關標籤/搜索