zoukankan      html  css  js  c++  java
  • 【ASP.NET】页面间传值

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

    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>

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

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

  • 相关阅读:
    使用了Theme但是没有效果问题
    4.0 流量控制preference
    android sdk国内目录http://mirrors.neusoft.edu.cn/android/repository/
    xmpp push篇一 广播消息
    cursorfilter
    android 特效UI实现
    Android四大组件一----Activity
    net user命令
    sql2005如何附加数据库
    sql2005中如何启用SA账号
  • 原文地址:https://www.cnblogs.com/a311300/p/1242852.html
Copyright © 2011-2022 走看看