ASP.NET 页面间传值

来源:互联网 发布:网络中控主机技术要求 编辑:程序博客网 时间:2024/06/03 14:31

在页面间跳转,会涉及到值和数据的传递问题.特用本文将我知道的一些方法归纳一下.

 

1.带参数传递

优点:使用方便

缺点:安全性低,适合传递简单类型的对象,比如数字.字符.但对对象.数组等不合适传递.

应用:

a.安全性不高,应对方式:对传递的值进行加密.

b.传递简单类型的对象.应对方式:在传递页通过简单类型对象给出标识,在被传递页通过标识获取复杂的对象.

案例:

URL加密类

URL编码解码类

传递页:

 protected void Button1_Click(object sender, EventArgs e)
    {
        
string ProjectID = "123456";
        Response.Redirect(
"Default2.aspx?ProjectID="+UrlEncrpt.Encrypt(ProjectID)+"");
    }

接收页:

protected void Page_Load(object sender, EventArgs e)
{
  
if (Request.QueryString["ProjectID"!= null)
  {
    Response.Write(UrlEncrpt.Decrypt(Request.QueryString[
"ProjectID"]));
  }
}

例子中的Response.Redirect()方法导致浏览器链接到一个指定的URL。当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。
这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面。

 

2.使用server.Transfer方法

优点:

    server.transfer从server端直接向下一页发起请求,不需要client再次发送请求.性能上比response.redirect提高将近25%的效率。Server.Transfer方法把执行流程从当前的ASPX文件转到同一服务器上的另一个ASPX页面。调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。

    如果用Server.Transfer方法实现页面之间的导航,浏览器中的URL不会改变,因为重定向完全在服务器端进行,浏览器根本不知道服务器已经执行了一次页面变换。
    默认情况下,Server.Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成True,就可以保留第一个页面的表单数据和查询字符串。

    同时,使用Server.Transfer时应注意一点:目标页面将使用原始页面创建的应答流,这导致ASP.NET的机器验证检查(Machine Authentication Check,MAC)认为新页面的ViewState已被篡改。因此,如果要保留原始页面的表单数据和查询字符串集合,必须把目标页面Page指令的 EnableViewStateMac属性设置成False。

缺点:

在本网站内的传递.不能在跨站点间使用.

server.Transfer()还有一个不足就是:当用户在a.aspx中提交了一个表单,然后用Server.Transfer()进入 b.aspx,这时如果用户刷新一下页面,浏览器便会问用户是否“重试”发送表单,如果用户点击“是”,那么,表单中的数据被重新发送到服务器。如发送表单的作用就是为了向数据库中插入一条记录,结果导不希望发生的事——同一表单被多次加入到数据库中。

应用:在本网站项目内传值.

案例:

传递页

protected void Button2_Click(object sender, EventArgs e)
{
  Server.Transfer(
"Default3.aspx");
}

接收页

protected void Page_Load(object sender, EventArgs e)
{
  TextBox tempTextBox;
  tempTextBox 
= (TextBox)PreviousPage.FindControl("TextBox1");
  Response.Write(tempTextBox.Text.ToString());
}

 

3.Server.Execute()方法

优点:

     Server.Execute方法允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面,当指定的ASPX页面执行完毕,控制流程重新返回原页面发出Server.Execute调用的位置。
     这种页面导航方式类似于针对ASPX页面的一次函数调用,被调用的页面能够访问发出调用页面的表单数据和查询字符串集合,所以要把被
调用页面Page指令的EnableViewStateMac属性设置成False。

缺点:相比Server.Transfer和Response.Redirect而言,耗费资源更多.

应用:在被跳转的页执行后台操作.如比挂流量统计.

例子:

protected void Button3_Click(object sender, EventArgs e)
{
  Server.Execute(
"Default4.aspx");
}

 

4.如果被传递的参数被多个被传递的页面使用.可以将该值放到缓存中.

优点:可以长期存在,被多个页面使用.不需要用明文安全性高.可以存储对象.而不限于简单对象.

缺点:缓存有其生存周期.

应用:

通过使用Application.sessin.cookie.cache.viewstate等缓存机制来保存数据.

例子:

我将另写一文.介绍缓存的使用.

 

5.父 - 子 - 父 数据传递

优点:可以在两个页面中进行数据的双向传递.

缺点:应用于特定场景.

应用:弹出选择.比如在做添加人员信息时,需要选择属于哪个公司.公司较多.不方便用下拉框选择.可以将公司列表放到一个单独页面中,该页面可以以更加丰富的形式显示公司列表信息.

例子:

传递页中js用来处理回传数据.文本框显示数据.

<script language="javascript"> 
  
function func(SelectedId)
  {
     document.all[
"TextBox1"].value = SelectedId;
  }
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

前台打开接收页

<input id="Button4" runat=server class="buttomw" onclick="window.open('Default5.aspx?UserId=123456','','menubar=no,scrollbars=no,width=600,height=460,left=150,top=50')" type="button" value=" 浏 览…" />

后台打开接收页

Page.Response.Write("<script>window.open('TempAssignTask1.aspx?ItemId=" + iPrimaryKey + "','','menubar=no,scrollbars=no,width=700,height=250,left=150,top=50')</script>");

接收页将选择的信息回传给传递页

protected void Button1_Click(object sender, EventArgs e)
{
  System.Text.StringBuilder sb 
= new System.Text.StringBuilder();
  sb.Append(
"<script>");
  sb.Append(
"/n");
  sb.Append(
"window.opener.func('您输入的是:'+" + this.TextBox1.Text.Trim() + ");/n");
  sb.Append(
"window.close();/n");
  sb.Append(
"/n");
  sb.Append(
"</script>");
  Page.RegisterClientScriptBlock(
"close", sb.ToString());
}

 

传值注意的地方:

1.如果在传递中文时,再现乱码.可以做以下设置:

 <meta http-equiv="Content-Type" content="text/html" charset="GB2312"/>

主要是字符集设置问题.可以将charset属性设置GB2312或者设置为GB18030

 

2.被跳转页,第一次进入时,会被触发IsPostback事件.

 

3.对传递参数的编码,设置web.config文件
<system.web>
......
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
......
</system.web>

--------------------------------------------------------------------------------------

大家如果有其他的方法,也请留言.我将持续跟进完善.

原创粉丝点击