初步想法(解决方案创建之前)
使用POST处理大数据,而不是GET。使用POST时不会在数据中使用查询字符串,因此URL长度限制不是问题。(各个浏览器的最大URL长度不同,因此在传输大数据时最好避免使用它)。
特殊的URL字符可以编码以在查询字符串中传递,因此这不应该成为问题。
或者您可以将数据从第一个页面存储到服务器端,并让第二个页面从服务器端获取它。但这是过度设计的。而且这样做需要进行不必要的服务器编程。
通过HTTP调用传递状态是标准做法。您不应该试图规避它。与其对抗,不如与之合作。所有设施都已为您内置。现在只需要jQuery提供一些帮助......
注意:请小心使用jQuery作为主要应用程序功能,以防JavaScript在浏览器中禁用。在大多数情况下,即使JavaScript被禁用,您的Web应用程序也应该在基本级别上可用。在此之后,添加JavaScript/jQuery以使体验更好,甚至更棒。
编辑:解决方案(带有ASP.NET处理)
实施解决方案的关键资源是:
它是如何工作的:从主页面开始,进行POST并在弹出窗口中显示结果。它按照以下顺序进行:
- 主脚本打开一个弹出窗口(如果尚未存在)
- 主脚本等待弹出窗口完全初始化
- 主脚本使用AJAX POST(发送请求)将参数传递到另一页
- 主脚本接收响应并在弹出窗口中显示它。
实际上,我们已经将数据发布到了弹出窗口,并将参数传递给了处理过程。
接下来有三个页面,它们构成了完整的解决方案。我将这3个页面都放在了桌面上,并且它在Google Chrome稳定版本3.0.195.38中运行良好。其他浏览器未经测试。您还需要将jquery-1.3.2.js放在同一个文件夹中。
main_page.html
这是您提供的逻辑的扩展。示例使用链接而不是表单按钮,但它具有相同的id=sourcePageBtn
。
此示例在POST发生时传递两个键/值对(仅作为示例)。在此处,您将传递自己选择的键/值对。
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.js"></script>
</head>
<body>
<a id="sourcePageBtn" href="javascript:void(0);">click to launch popup window</a>
<script>
$(function() {
$('#sourcePageBtn').click( function() {
($(window).data('popup') && !$(window).data('popup').closed)
|| $(window).data('popup', window.open('popup.html','MyPopupWin'));
var wndPop = $(window).data('popup');
(waitAndPost = function() {
if (!wndPop || !wndPop['ready'])
setTimeout(waitAndPost, 200);
else {
$.post('process.aspx', { name: "John", time: "2pm" }, function(data) {
$('p',wndPop.document).html(data);
});
}
})();
});
});
</script>
</body>
</html>
弹出窗口.html
这是从主页面指向的弹出窗口。您将在主页中的jQuery脚本中看到对popup.html的引用。
这里有一个“技巧”,当弹出窗口DOM最终加载时,设置window ['ready'] = true
。主要脚本会不断检查并等待直到此弹出窗口准备就绪。
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.js"></script>
</head>
<body>
<p>page is loaded</p>
</body>
<script>
$(function() {
window['ready'] = true;
});
</script>
</html>
process.aspx.cs (C# - ASP.NET process.aspx页面)
这是一个动态服务器页面,主页脚本将参数POST到该页面。AJAX参数以Page.Request集合的形式到达。
输出以纯文本形式返回,但您可以根据您应用程序的要求自定义响应。
public partial class process : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
string strName = Request["name"] ?? "(no name)";
string strTime = Request["time"] ?? "(no time)";
Response.ContentType = "text/plain";
Response.Write(string.Format("{0} arrives at {1}", strName, strTime));
}
protected override void Render(System.Web.UI.HtmlTextWriter writer) {
}
}
原始/主页面将结果显示在弹出窗口中。因此,弹出窗口的内容被重写为"[name]到达[time]"
主要参考:HTTP 简单易懂,jQuery Ajax 成员和示例。