在页面间跳转,会涉及到值和数据的传递问题.特用本文将我知道的一些方法归纳一下.
1.带参数传递
优点:使用方便
缺点:安全性低,适合传递简单类型的对象,比如数字.字符.但对对象.数组等不合适传递.
应用:
a.安全性不高,应对方式:对传递的值进行加密.
b.传递简单类型的对象.应对方式:在传递页通过简单类型对象给出标识,在被传递页通过标识获取复杂的对象.
案例:
URL加密类
传递页:
{
string ProjectID = "123456";
Response.Redirect("Default2.aspx?ProjectID="+UrlEncrpt.Encrypt(ProjectID)+"");
}
接收页:
{
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,这时如果用户刷新一下页面,浏览器便会问用户是否“重试”发送表单,如果用户点击“是”,那么,表单中的数据被重新发送到服务器。如发送表单的作用就是为了向数据库中插入一条记录,结果导不希望发生的事——同一表单被多次加入到数据库中。
应用:在本网站项目内传值.
案例:
传递页
{
Server.Transfer("Default3.aspx");
}
接收页
{
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而言,耗费资源更多.
应用:在被跳转的页执行后台操作.如比挂流量统计.
例子:
{
Server.Execute("Default4.aspx");
}
4.如果被传递的参数被多个被传递的页面使用.可以将该值放到缓存中.
优点:可以长期存在,被多个页面使用.不需要用明文安全性高.可以存储对象.而不限于简单对象.
缺点:缓存有其生存周期.
应用:
通过使用Application.sessin.cookie.cache.viewstate等缓存机制来保存数据.
例子:
我将另写一文.介绍缓存的使用.
5.父 - 子 - 父 数据传递
优点:可以在两个页面中进行数据的双向传递.
缺点:应用于特定场景.
应用:弹出选择.比如在做添加人员信息时,需要选择属于哪个公司.公司较多.不方便用下拉框选择.可以将公司列表放到一个单独页面中,该页面可以以更加丰富的形式显示公司列表信息.
例子:
传递页中js用来处理回传数据.文本框显示数据.
function func(SelectedId)
{
document.all["TextBox1"].value = SelectedId;
}
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
前台打开接收页
后台打开接收页
接收页将选择的信息回传给传递页
{
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>
--------------------------------------------------------------------------------------
大家如果有其他的方法,也请留言.我将持续跟进完善.