【发布时间】:2009-09-22 08:42:05
【问题描述】:
将值从 1 个页面代码传输到另一个代码有哪些不同的方法? 隐藏文件可以在没有表单标签的情况下工作吗? 我在页面后面有 2 个代码。我需要从 1 页传输特定值并在页面后面的其他代码中获取。 在这种情况下可以遵循的最佳方法是什么?
注意:由于要传输的字符串很大,我们不能使用Querystring。
【问题讨论】:
将值从 1 个页面代码传输到另一个代码有哪些不同的方法? 隐藏文件可以在没有表单标签的情况下工作吗? 我在页面后面有 2 个代码。我需要从 1 页传输特定值并在页面后面的其他代码中获取。 在这种情况下可以遵循的最佳方法是什么?
注意:由于要传输的字符串很大,我们不能使用Querystring。
【问题讨论】:
您可以使用跨页发布。使用它时,您只需指定不同的页面应处理回发,请参阅此链接:http://msdn.microsoft.com/en-us/library/ms178139.aspx
我一般不建议使用会话变量,因为它们会降低应用程序的可伸缩性,而且它们不能很好地与浏览器返回按钮配合使用
编辑: 另一种选择可能是将数据存储在当前的 HttpContext 中,然后使用 Server.Transfer
HttpContext.Current.Items["tempData"] = yourLongData;
Server.Transfer("NewPage.aspx");
在新页面上,您可以从 HttpContext 读取值。这是可行的,因为新页面是在同一个请求中处理的,因此是在同一个上下文中处理的。
但这不会导致客户端重定向,因此它可能并不适用于所有情况
【讨论】:
查询字符串它将获胜。
虽然如果它是您试图从一页调用到另一页的代码,那么听起来您可能会遇到麻烦。您从两个页面调用的代码都应该在类库中,但如果是这样的话,这个答案会很长,有些人可能会说这个问题太开放了。
【讨论】:
首页
//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 应该包含会话特定的数据,您必须正确使用它,您也可以使用 Server.Transfer
【讨论】:
如果没有表单标签,隐藏字段将无法工作。
a) 您可以发布将特定值放入隐藏字段或文本字段的页面,并通过string MyVal = Request.Form["FieldName"];在下一页检索它
b) 您可以通过查询字符串发送值。假设您使用 val=6 重定向到 default2.aspx,例如Response.Redirect("default2.aspx?val=6"); 并通过
string MyVal = Request.QueryString["val"].ToString();
【讨论】:
您可以将值存储在 Session 中。如果并发是一个问题,您可以使用唯一键(如 guid)并在查询字符串中传递键。
【讨论】:
要将控件从一个页面转移到另一个页面,您可以使用
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 将用户重定向到正在运行的页面 在不同的服务器上。
【讨论】:
对于真正的大块数据,您不可能将所有数据发送给客户端,然后立即返回。当您将值作为表单字段或查询字符串放置时,这实际上就是您正在做的事情。您将耗尽带宽并降低用户体验。
在会话中存储大量数据是一个非常糟糕的主意。它要么是进程内占用了您的服务器主内存,要么是被序列化到另一台服务器(状态服务器),或者存储在数据库中(Sql 状态)。为每个请求检索会话数据。这是一个性能杀手。
如果您确实需要将大量数据从一页传递到下一页,请评估您的一致性需求。如果它真的是事务性的,也许你需要硬着头皮存储在数据库中。如有必要,其他页面可以检索。
大多数数据库可以(有效地)存储您提供给它们的任意数量的数据,但如果您不需要数据库为您提供的一致性,请不要滥用数据库。在我的脑海中,我会去获取大约 8k 的数据。我认识 varchar(max) 等,但您需要评估存储所有(瞬态)数据、日志空间等的权衡。
否则,在共享网络磁盘上创建临时文件并传递令牌并没有错。使用 guid 和日期生成唯一的文件名。
【讨论】: