【问题标题】:ASP.net AJAX Call doesn't work on 2nd clickASP.net AJAX 调用在第二次单击时不起作用
【发布时间】:2013-08-01 14:01:05
【问题描述】:

我有一个 ASP.net webforms 应用程序,它有一个客户端单击事件,该事件对调用长时间运行的 web 服务的页面进行 Ajax 调用 (XMLHttpRequest)。

流程是这样的:

Page1.aspx 点击调用 Page2.aspx 的链接

Page2.aspx 使用委托和 IAsyncResult 调用 WebService.asmx

WebService.asmx 使用扩展的 BackgroundWorker 在单独的线程上工作

IAsyncResult 调用 BeginInvoke(),然后调用 EndInvoke()

问题:第一次单击 Page1.aspx 上的链接可以正常工作 - 页面 1 调用页面 2,页面 2 调用 Web 服务,工作就完成了。

如果我再次单击该链接(在 WebService 工作完成后),它不会触发 Page2.aspx 应该调用的工作。

当我调试通过时,我收到来自 Page1.aspx 的 Javascript 警报,显示调用了 XMLHttpRequest.send() 请求;然而,调试器并没有把我带到 Page2.aspx 页面……事实上,它没有把我带到任何地方。

下面是我的 Ajax 函数的内部: var xmlhttp = null;

if (window.XMLHttpRequest) {
     xmlhttp = new XMLHttpRequest();
}
else {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

xmlhttp.open("GET", "Page2.aspx?SomeQueryString=" + someID, true);
xmlhttp.send();

xmlhttp.onreadystatechange = function () {               
   if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        try {
            var responseText = xmlhttp.responseText;
            document.getElementById("_lblExportStatus").innerHTML = responseText;
        }
        catch (e) {
             alert("Error: " + e.Message);
        }
   }
}
return false;

编辑 我发现将不同的查询字符串传递给 XMLHttpRequest 对象确实会导致工作完成。问题在于在 Open() 方法中传递完全相同的字符串。向 open() 方法发送不同的字符串可以正常工作。

【问题讨论】:

  • 将链接连接到 AJAX 函数的逻辑在哪里?
  • 该逻辑是 Page1.aspx 上的内嵌 Javascript 代码。调用Javascript的LinkBut​​ton控件有一个后端调用:_lnkExport.Attributes.Add("OnClick", "return doBenefitExport(" + _parsedBenefit.Id + ");");
  • 你能在 xmlhttp.open("Get") 之前做警报吗?在该警报中检查您的 url 是否正确构建并且有效还检查代码实际上是否正确执行到此级别..
  • 我已经在 .open() 之前和 .send() 之后进行了调试 Javascript alert() 调用。我在 open() 之前放置的警报显示了我传递给 open() 的 URL,并且显示正确。
  • 我还发现,即使离开这个页面并返回,我仍然无法成功拨打电话...

标签: asp.net ajax web-services


【解决方案1】:

尝试使用 POST 代替 OF GET,如果仍然无法使用,则使用

jQuery 直接调用 ASP.NET AJAX 页面方法或简单地调用 web 服务 直接使用

 $.ajax({
 type: "POST",
 url: "Page2.aspx?SomeQueryString=" + someID, true);
 data: "{}",
 contentType: "application/json; charset=utf-8",
 dataType: "json",
 success: function(msg) {
  // Do something interesting here.
 }
 });

链接:[更多信息]

http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

希望对你有帮助

问候

沙兹

【讨论】:

  • 这就是答案 - 使用 POST 而不是 GET。问题解决了。谢谢
【解决方案2】:

要克服缓存问题,您可以使用时间戳作为唯一令牌 - 即:

xmlhttp.open("GET", "Page2.aspx?SomeQueryString=" + someID + 
"&timestamp=" + (new Date()).toString(), true);

【讨论】:

  • 这也是个好主意。我想将此标记为答案,但建议 POST 而不是 GET 的答案可能比这个好 1/10%,尽管这个解决方案让我觉得自己像一个我没想到的傻瓜。谢谢!
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2015-11-25
相关资源
最近更新 更多