现在的位置: 首页 > 综合 > 正文

ASP.NET页面传值的方法 和一些实用技巧

2012年06月06日 ⁄ 综合 ⁄ 共 7485字 ⁄ 字号 评论关闭

一. 使用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>

 

抱歉!评论已关闭.