使用jQuery在ASP.NET页面之间传递参数

3
我需要使用jQuery从一个ASP.NET页面传递4个参数(3个字符串和一个逗号分隔的列表)到另一个ASP.NET页面。目标页面应该作为单独的窗口启动,以下jQuery代码片段可以正常工作:
$('#sourcePageBtn').click(function(){
   window.open("destinationPage.aspx");
   return false;
});

如何将参数传递到目标页面?我试图避免使用查询字符串来传递参数,因为:
  1. 我不想在目标窗口中显示url参数(这些参数可能非常长)。
  2. 字符串参数中存在一些特殊字符,如'、/、\和&等。
请给出建议。
编辑: 我正在尝试访问aspx文件的脚本部分中的参数。
<script language="C#" runat="server">
    protected void Page_Load ( object src, EventArgs e) 
    {
     //Creating dynamic asp controls here
    }
</script>

我需要在脚本部分的Page_Load中使用参数,因为我正在创建一些动态图表控件,这些控件依赖于这些参数。

谢谢!

2个回答

5

初步想法(解决方案创建之前)

  1. 使用POST处理大数据,而不是GET。使用POST时不会在数据中使用查询字符串,因此URL长度限制不是问题。(各个浏览器的最大URL长度不同,因此在传输大数据时最好避免使用它)。

  2. 特殊的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() {

  // Open popup window if not already open, and store its handle into jQuery data.
  ($(window).data('popup') && !$(window).data('popup').closed) 
   || $(window).data('popup', window.open('popup.html','MyPopupWin'));

  // Reference the popup window handle.
  var wndPop = $(window).data('popup');

  // Waits until popup is loaded and ready, then starts using it
  (waitAndPost = function() {
   // If popup not loaded, Wait for 200 more milliseconds before retrying
   if (!wndPop || !wndPop['ready']) 
    setTimeout(waitAndPost, 200);

   else  { 
       // Logic to post (pass args) and display result in popup window...
    // POST args name=John, time=2pm to the process.aspx page...
    $.post('process.aspx', { name: "John", time: "2pm" }, function(data) {
     // and display the response in the popup window <P> element.
     $('p',wndPop.document).html(data);
    });
   }
  })(); //First call to the waitAndPost() function.


 });
});

</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>
 <!--  The example P element to display HTTP response inside -->
 <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) {
        // Access "name" argument.
        string strName = Request["name"] ?? "(no name)";
        // Access "time" argument. 
        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) {
        // Just to suppress Page from outputting extraneous HTML tags.
        //base.Render(writer); //don't run.
    }

}

原始/主页面将结果显示在弹出窗口中。因此,弹出窗口的内容被重写为"[name]到达[time]"


主要参考:HTTP 简单易懂jQuery Ajax 成员和示例。


谢谢。我需要在 jQuery 按钮点击处理程序中启动目标页,因为我正在收集一些 HTML 元素的 ID 和文本值。其次,我需要启动一个新页面,而不是重定向。window.open() 可以帮我做到这一点,但我认为它不支持 POST 类似的行为。 - Arnkrishn
我编辑了一下,加入了一个jQuery POST示例的链接。我走在正确的方向上吗? - John K
再次感谢您。您的回复大部分对我来说都很有意义。$.POST()确实会将控制权转移到目标页面。但是,控制权会返回到源页面。此外,目标页面不会作为单独的页面启动。 - Arnkrishn
感谢您的耐心和努力。几乎一切都很好。只是我无法在ASP.NET目标页面的页面加载中访问参数。我该怎么做?我需要修改页面加载参数列表以接收这些参数吗? - Arnkrishn
@Andriyev:这是奇怪的应用程序行为。你可以将其简化为围绕新问题(ajax参数不被ASP.NET看到)的简单场景,然后在SO上发布一个单独的问题(放入浏览器、版本等细节)。这样做会得到更具体的答案,并极有可能更快地解决问题。 - John K
显示剩余4条评论

0
如果您在打开新窗口时保留对其的引用,即var destWin = window.open(...),则可以访问destWin窗口对象上的变量和方法。或者,您可以从目标窗口使用window.opener“回溯”到原始窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接