【问题标题】:Pass values from 1 aspx page to another?将值从 1 aspx 页面传递到另一个页面?
【发布时间】:2009-09-22 08:42:05
【问题描述】:

将值从 1 个页面代码传输到另一个代码有哪些不同的方法? 隐藏文件可以在没有表单标签的情况下工作吗? 我在页面后面有 2 个代码。我需要从 1 页传输特定值并在页面后面的其他代码中获取。 在这种情况下可以遵循的最佳方法是什么?

注意:由于要传输的字符串很大,我们不能使用Querystring。

【问题讨论】:

    标签: .net asp.net


    【解决方案1】:

    您可以使用跨页发布。使用它时,您只需指定不同的页面应处理回发,请参阅此链接:http://msdn.microsoft.com/en-us/library/ms178139.aspx

    我一般不建议使用会话变量,因为它们会降低应用程序的可伸缩性,而且它们不能很好地与浏览器返回按钮配合使用

    编辑: 另一种选择可能是将数据存储在当前的 HttpContext 中,然后使用 Server.Transfer

    HttpContext.Current.Items["tempData"] = yourLongData;
    Server.Transfer("NewPage.aspx");
    

    在新页面上,您可以从 HttpContext 读取值。这是可行的,因为新页面是在同一个请求中处理的,因此是在同一个上下文中处理的。

    但这不会导致客户端重定向,因此它可能并不适用于所有情况

    【讨论】:

      【解决方案2】:

      查询字符串它将获胜。

      虽然如果它是您试图从一页调用到另一页的代码,那么听起来您可能会遇到麻烦。您从两个页面调用的代码都应该在类库中,但如果是这样的话,这个答案会很长,有些人可能会说这个问题太开放了。

      【讨论】:

      • 由于要传输的字符串很大,我们不能使用Querystring。
      • 鸽子,有没有其他办法?...如果两个页面不在同一个类库中,我们可以传递值吗?
      • 多大?您可以在查询字符串中放置很多内容,否则如果允许的话,可以暂时放入会话、缓存甚至 cookie 中。取决于您的设置
      • 查询字符串的最大长度为 255 个字符
      • fwiw 查询字符串在实践中的最大大小接近 8000,一些旧的 IE 安装大约为 2000,但如果您尝试执行诸如传递文件之类的操作,这仍然不是很大。如果你在查询字符串中放了这么多,那么你做错了。
      【解决方案3】:

      首页

      //create a unique key
      string guid = Guid.NewGuid().ToString();
      //store large data in the session
      Session[guid] = BIG_VALUE_TO_TRANSFER;
      //redirect to new page, passing key as parameter
      Response.Redirect("SecondPage.aspx?guid="+guid");
      

      第二页

      //retrieve data from session using the key in the querystring
      //you should really validate this but i can't be bothered
      BIG_TYPE bigvalue = (BIG_TYPE)Session[Request.QueryString["guid"]];
      

      【讨论】:

      • 为了将信息从一个页面传递到另一个页面,最好不要使用 Session。
      • Session 对象用于存储特定于会话的数据,而不是特定于页面的数据。
      • 无论您使用哪种会话(inproc、状态服务器、sql 服务器),在会话中存储大量数据总是一个坏主意
      【解决方案4】:

      使用可以为您完成工作的 Session,但由于 Session 应该包含会话特定的数据,您必须正确使用它,您也可以使用 Server.Transfer

      【讨论】:

        【解决方案5】:

        如果没有表单标签,隐藏字段将无法工作。

        a) 您可以发布将特定值放入隐藏字段或文本字段的页面,并通过string MyVal = Request.Form["FieldName"];在下一页检索它

        b) 您可以通过查询字符串发送值。假设您使用 val=6 重定向到 default2.aspx,例如Response.Redirect("default2.aspx?val=6"); 并通过

        在下一页检索它
        string MyVal = Request.QueryString["val"].ToString();
        

        【讨论】:

        • 谢谢希马德里。但是由于要传输的字符串很大,我们不能使用Querystring。还有什么办法?
        【解决方案6】:

        您可以将值存储在 Session 中。如果并发是一个问题,您可以使用唯一键(如 guid)并在查询字符串中传递键。

        【讨论】:

        • 谢谢埃里克。你能对会话方法更详细一点吗?
        • 查看我们的答案。我也建议查看跨页回发。
        【解决方案7】:

        要将控件从一个页面转移到另一个页面,您可以使用

        Server.Transfer ( "newpage.aspx" );
        

        方法

        为了将值从一个页面传递到另一个页面,您可以使用 Context

        Context.Items["Value1"] = "value to pass";
        

        并将目标页面中的值检索为

        string val = Context.Items["Value1"].ToString(); // check for null
        

        查询字符串的最大长度在不同的浏览器中会有所不同。

        通过查询字符串传递敏感信息也不是一个好方法。

        Response.Redirect 涉及往返 到服务器,而 Server.Transfer 通过避免节省服务器资源 往返。它只是改变了 网络服务器的焦点不同 页面和转移页面处理 到另一个页面。

        如果您使用的是 Server.Transfer,那么 您可以直接访问这些值, 控件和属性 您无法使用的上一页 响应。重定向。

        Response.Redirect 更改 URL 浏览器的地址栏。所以他们可以 被收藏。而 Server.Transfer 保留原来的 URL 浏览器的地址栏。这只是 替换之前的内容 新的页面。

        Response.Redirect 可用于两者 .aspx 和 html 页面,而 Server.Transfer 只能用于 .aspx 页面并且特定于 ASP 和 ASP.NET。

        Response.Redirect 可用于 将用户重定向到外部 网站。 Server.Transfer 可以使用 仅在运行相同的站点上 服务器。您不能使用 Server.Transfer 将用户重定向到正在运行的页面 在不同的服务器上。

        【讨论】:

          【解决方案8】:

          对于真正的大块数据,您不可能将所有数据发送给客户端,然后立即返回。当您将值作为表单字段或查询字符串放置时,这实际上就是您正在做的事情。您将耗尽带宽并降低用户体验。

          在会话中存储大量数据是一个非常糟糕的主意。它要么是进程内占用了您的服务器主内存,要么是被序列化到另一台服务器(状态服务器),或者存储在数据库中(Sql 状态)。为每个请求检索会话数据。这是一个性能杀手。

          如果您确实需要将大量数据从一页传递到下一页,请评估您的一致性需求。如果它真的是事务性的,也许你需要硬着头皮存储在数据库中。如有必要,其他页面可以检索。

          大多数数据库可以(有效地)存储您提供给它们的任意数量的数据,但如果您不需要数据库为您提供的一致性,请不要滥用数据库。在我的脑海中,我会去获取大约 8k 的数据。我认识 varchar(max) 等,但您需要评估存储所有(瞬态)数据、日志空间等的权衡。

          否则,在共享网络磁盘上创建临时文件并传递令牌并没有错。使用 guid 和日期生成唯一的文件名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多