页面、方法-ASP.NET中有几种页面传值方法-by小雨

在本文中,我们主要分析页面、方法-的内容,自我感觉有个不错的建议和大家分享下

    现在在ASP.NET中页面值传共有这么几种式方:
1、表单提交,
<form action= "target.aspx" method = "post" name = "form1">
<input name = "param1" value = "1111"/>
<input name = "param2" value = "2222"/> 
</form>
....
form1.submit();
....
此种方在ASP。NET中无效,因为ASP。NET的表单是总提交到自身页面,如果要提交到别一页面,要需殊特处置。
2、<A href="target.aspx?param1=1111&m2=2222">接链地址送传</A>
接收页面: string str = Request["param1"]
3、Session享共
发送页面:Session("param1") = "1111"; 
按收页面 string str = Session("param1").ToString(); 
4、Application享共
发送页面: Application("param1") = "1111"; 
按收页面: string str = Application("param1").ToString(); 
此种方法不常应用,因为Application在一个应用程序域围范享共,全部户用可以变改及设置其值,故只应用计数器等要需全局变量的方地。
5、Cookie
6、Response.Redirect()式方
Response.Redirect("target.aspx?param1=1111&m2=2222")
接收页面: string str = Request["param1"]
7、Server.Transfer()式方。
Server.Transfer("target.aspx?param1=1111&m2=2222")
接收页面: string str = Request["param1"]
例子:如果在两个页面间要需大批的参数要传递传,如据数查询等页面时,用1 - 6的方法值传及其便不,而第 7 种方法确有一特独的势优!但应用该方法时要需定一的设置,现单简分析一下该方法的应用式方:
以查询据数页面为例:
在查询页面中设置如下私有属性(QueryPage.aspx):
public class QueryPage : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.TextBox txtStaDate;
    protected System.Web.UI.WebControls.TextBox txtEndDate;
...
    /// <summary>
    /// 开始时光
    /// </summary>
    public string StaDate
    {
       get{ return this.txtStaDate.Text;}
       set{this.txtStaDate.Text = value;}
    }
/// <summary>
/// 结束时光
/// </summary>
public string EndDate
{
    get{ return this.txtEndDate.Text;}
    set{this.txtEndDate.Text = value;}
}
....
private void btnEnter_Click(object sender, System.EventArgs e)
{
    Server.Transfer("ResultPage.aspx");
}
}
在示显查询结果页面(ResultPage.aspx):
public class ResultPage : System.Web.UI.Page
{
    private void Page_Load(object sender, System.EventArgs e)
    {
   //换转一下可即得获前一页面中输入的据数
       QueryPage queryPage = ( QueryPage )Context.Handler;
      Response.Write( "StaDate:" );
       Response.Write( queryPage.StaDate );
       Response.Write( "<br/>EndDate:" );
       Response.Write( queryPage.EndDate );
    }
}


例:如果有多许查询页面共用一个结果页面的设置方法:
在这类式方中关键在于“ QueryPage queryPage = ( QueryPage )Context.Handler; ”的换转,只有换转不依赖于特定的页面时可即实现。
如果让全部的查询页面都继承一个口接,在该口接中定义一个方法,该方法的一唯作用就是让结果页面得获构建结果时所需的参数,可就实现多页面享共一个结果页面操纵!
1、先定义一个类,用该类放置全部查询参数:
/// <summary>
/// 结果页面中要用到的值
/// </summary>
public class QueryParams
{
    private string staDate;
    private string endDate;


    /// <summary>
    /// 开始时光
    /// </summary>
    public string StaDate
    {
       get{ return this.staDate;}
       set{this.staDate = value;}
    }
/// <summary>
/// 结束时光
/// </summary>
public string EndDate
{
    get{ return this.endDate;}
    set{this.endDate = value;}
}
}


2、口接定义:
/// <summary>
/// 定义查询口接。
/// </summary>
public interface IQueryParams
{
    /// <summary>
    /// 参数
    /// </summary>
    QueryParams Parameters{get;}
}

3、查询页面继承IQueryParams口接(QueryPage.aspx):
/// <summary>
///查询页面,继承口接
/// </summary>
public class QueryPage : System.Web.UI.Page, IQueryParams
{
    protected System.Web.UI.WebControls.TextBox txtStaDate;
    protected System.Web.UI.WebControls.TextBox txtEndDate;


private QueryParams queryParams;
...
/// <summary>
/// 结果页面用到的参数
/// </summary>
public QueryParams Parameters
{
    get
    {
       return queryParams;
    }
}
....
private void btnEnter_Click(object sender, System.EventArgs e)
{
    //值赋
    queryParams = new QueryParams();
    queryParams.StaDate = this.txtStaDate.Text;
    queryParams.EndDate = this.txtEndDate.Text


    Server.Transfer("ResultPage.aspx");
}
}
4、别外的页面也如此设置
5、接收页面(ResultPage.aspx):
public class ResultPage : System.Web.UI.Page
{
    private void Page_Load(object sender, System.EventArgs e)
{
QueryParams queryParams = new QueryParams();
IQueryParams queryInterface;
//实现该口接的页面
if( Context.Handler is IQueryParams)
{
    queryInterface = ( IQueryParams )Context.Handler;
    queryParams = queryInterface.Parameters;
}

Response.Write( "StaDate:" );
Response.Write( queryParams.StaDate );
Response.Write( "<br/>EndDate:" );
Response.Write( queryParams.EndDate );
}
}

详细分析:
一、应用Querystring
Querystring是一种非常单简的值传式方,其点缺就是会把要送传的值示显在浏览器的地址栏中,并且在此方法中不能够递传对象。如果你想递传一个安全性不是那么太要重或者是一个单简的数值时,用此方法最好不过了。面下通过一个小例子来成完值传作工,骤步如下:
1、创立一个web form
2、在建新的web form中放置一个button1,在放置两个TextBox1,TextBox2 
3、为button按钮创立click件事
码代如下:
private void Button1_Click
(object sender, System.EventArgs e)
{
string url;
url="webform2.aspx?name=" + 
   TextBox1.Text + "&email=" + 
   TextBox2.Text;
Response.Redirect(url);
}
4、建新一个目标页面命名为webform2
5、在webform2中放置两个Label1,Label2
在webform2的Page_Load中添加如下码代:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
}
运行,可即看到递传后的结果了。


二、应用Session变量


应用Session变量值传是一种最常见的式方了,此中式方不仅可以把值递传到下一个页面,还可以叉交递传到多个页面,直至把Session变量的值removed后,变量才会失消。举个例子看看:
1、创立一个webform
2、在建新的webform中放置一个button1,在放置两个TextBox1,TextBox2 
3、为button按钮创立click件事
码代如下:
private void Button1_Click
(object sender, System.EventArgs e)
{
    Session["name"]=TextBox1.Text;
    Session["email"]=TextBox2.Text;
    Response.Redirect("webform2.aspx");
}
4、建新一个目标页面命名为webform2
5、在webform2中放置两个Label1,Label2
在webform2的Page_Load中添加如下码代:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
}
运行,可即看到递传后的结果了。


三、应用Server.Transfer
这个方法比相面下分析的方法微稍庞杂一点,但在页面间值递传中倒是殊特有效的,应用该方法你可以在另一个页面以对象属性的式方来存取露显的值,当然了,应用这类方法,你要需额定写一些码代以创立一些属性以便可以在另一个页面问访它,但是,这个式方带来的处好也是不言而喻的。整体来讲,应用这类方法是洁简的同时又是面向对象的。应用这类方法的整个进程如下:
1,在页面里添加须要的件控
2,创立返回值的Get属性进程
3,创立可以返回表单的按钮和接链按钮
4,在按钮单击件事处置程序中调用Server.Transfer方法转移到指定的页面
5,在第二个页面中,我们就可以够应用Context.Handler属性来得获前一个页面实例对象的引用,通过它,就可以够应用存取前一个页面的件控的值了
以下码代综合实现上述骤步进程的码代:
  源页面WebForm1.aspx.cs中的分部码代:
    把以下的码代添加到页面中
public string Name
{
     get
     {
         return TextBox1.Text;
     }
}


public string EMail
{
     get
     {
         return TextBox2.Text;
     }
}
  然后调用Server.Transfer方法
private void Button1_Click(object sender, System.EventArgs e)
{
     Server.Transfer("WebForm2.aspx");
}
   目标页面码代:


在WebForm2.aspx中务必在第一句话添加


<%@ Reference Page="~/WebForm1.aspx" %>或


<%@ PreviousPageType VirtualPath="~/WebForm1.aspx" %>


然后在WebForm2.aspx.cs中添加如下。




private void Page_Load(object sender, System.EventArgs e)
{
     //create instance of source web form
     WebForm1 wf1;
     //get reference to current handler instance
     wf1=(WebForm1)Context.Handler;
     Label1.Text=wf1.Name;
     Label2.Text=wf1.EMail;
}


如果在调试的进程中到遇误错.就到C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files中把建新的网站名的文件夹删掉.(要先关掉Visual Studio开发环境再删)
5、建新一个目标页面命名为webform2
6、在webform2中放置两个Label1,Label2
在webform2的Page_Load中添加如下码代:
private void Page_Load
(object sender, System.EventArgs e)
{
//创立原始窗体的实例
WebForm1 wf1;
//得获实例化的句柄
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;


}
运行,可即看到递传后的结果了。
四.应用@PreviousPageType指令
这个指令是.net 2.0中的一个新指令,用于处置ASP.NET 2.0供给的跨页面送传新功能.用于批定跨页面的送传进程起始于哪个页面.包括两个属性:
TypeName:设置送回时的派生类名
VirtualPath:设置送回时所送传页面的地址.
如下示例:
源页面WebForm1.aspx中有一个TextBox,ID为txtName.在WebForm1.aspx.cs中设置一个属性:
public TextBox Name
{
  get{return this.txtName;}//返回一个件控对象
}
在目标页面的计划文件中(WebForm2.aspx)的最上方加上:
 <%@ PreviousPageType VirtualPath="~/Page1.aspx"%>,
然后就可以引用WebForm1.aspx中定义的属性了.
在WebForm2.aspx.cs中可以有如下引用式形(假设WebForm2.aspx中有一个ID为lblName的Label):
lblName.Text="Hello"+PreviousPage.Name.Text+"<br />";

    
五.利用某些件控的PostBackUrl属性
示例:仍然是源页面WebForm1.aspx和目标页面WebForm2.aspx.
WebForm1.aspx中的分部码代:
<asp:Button ID="btnPostBack" Runat="server" Text="PBButton"></asp:Button>
<asp:TextBox ID="txtName" Runat="server" ></asp:TextBox>
<asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
WebForm2.aspx.cs中的分部码代:
protected void Page_Load(object Sender,System.EventArgs e)

    {
TextBox txtName;
  Calendar calendar1;
txtName=(TextBox)PreviousPage.FindControl("txtName");
 calendar1=(Calendar)PreviousPage.FindControl("Calendar1");
 Label.Text="Hello,"+txtName.Text+calendar1.SelectedDate.ToShortDateString();
}
应用这类方法存在一个题问:如果在没有单击那个按钮之前,也就是未处置WebForm1.aspx之前,有人请求了WebForm2.aspx,该怎么办?这就要需在WebForm2.aspx中的码代处置之前加一个判断.应用IsCrossPagePostBack属性,这与IsPostBack属性很似相,它许允检查请求是不是来自WebForm1.aspx.如下:
protected void Page_Load(object Sender,System.EventArgs e)
{
  if(PreviousPage.IsCrossPagePostBack)
    {
        TextBox txtName;
    Calendar calendar1;
       txtName=(TextBox)PreviousPage.FindControl("txtName");
       calendar1=(Calendar)PreviousPage.FindControl("Calendar1");
       Label.Text="Hello,"+txtName.Text+calendar1.SelectedDate.ToShortDateString();
    }
    else
    {
        Response.Redirect("WebForm1.aspx");
   }
}

六、 应用Cookie对象变量
这个也是大家常应用的方法,与Session一样,是对个一每户用而言的,但是有个实质的区分,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的应用要配合ASP.NET内置对象Request来应用。
a.aspx的C#码代
private void Button1_Click(object sender, System.EventArgs e)
{
    HttpCookie cookie_name = new HttpCookie("name");
    cookie_name.Value = Label1.Text;
    Reponse.AppendCookie(cookie_name);
    Server.Transfer("b.aspx");
}
b.aspx中C#码代
private void Page_Load(object sender, EventArgs e)
{
    string name;
    name = Request.Cookie["name"].Value.ToString();
}

七、应用Application 对象变量
Application对象的作用围范是整个全局,也就是说对全部户用都有效。其经常使用的方法用Lock和UnLock。
a.aspx的C#码代
private void Button1_Click(object sender, System.EventArgs e)
{
    Application["name"] = Label1.Text;
    Server.Transfer("b.aspx");
}


b.aspx中C#码代
private void Page_Load(object sender, EventArgs e)
{
    string name;
    Application.Lock();
    name = Application["name"].ToString();
    Application.UnLock();
}


文章结束给大家分享下程序员的一些笑话语录: 神灯新篇
一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”

posted @ 2013-04-16 21:34  坚固66  阅读(188)  评论(0编辑  收藏  举报