【问题标题】:Stop button from opening new tab/window upon exception异常时停止按钮打开新选项卡/窗口
【发布时间】:2013-12-04 16:15:48
【问题描述】:
我有一个按钮使用
OnClientClick="document.forms[0].target = '_blank'; window.setTimeout(fixform, 500);"
允许OnClick 事件到Response.Redirect 到一个新窗口。 “fixform”将目标设置为正常。当一切都按计划进行时,这很有效。当 OnClick 事件引发异常时,如何阻止它打开新窗口?我已尝试 Thread.Sleep 500 毫秒以使表单自行修复,但它仍会在新窗口中打开当前页面,但有例外。
【问题讨论】:
标签:
c#
asp.net
button
postback
response.redirect
【解决方案1】:
当 OnClick 事件引发异常时,如何阻止它打开新窗口?
你不这样做,因为它在新窗口打开之前不会执行该事件。客户端代码和服务器端代码在完全不同的机器上执行的时间完全不同。 Thread.Sleep() 例如发生在服务器上,在请求已经发出之后。这里发生的事情是:
- 浏览器打开一个新窗口
- 新窗口向服务器发出请求
- 服务器抛出错误并以错误响应请求
如果不了解更多关于这里实现的整体结构和用户体验,很难给出建议。如果发生错误应该发生什么?是否可以更有意义地处理错误,以便在新窗口中至少显示一些有用的东西? (也就是说,异常本身不应该在新窗口中可见,也不应该对用户可见,而是处理它的某个页面。)
如果您希望在发生错误时关闭新窗口,那么一种可能性是在发生错误时向页面发出类似这样的 JavaScript:
window.close();
这样,如果没有错误,窗口就会保持打开状态。但如果出现错误,客户端代码会关闭窗口。 (由于服务器端代码无法关闭窗口,在这种情况下确实没有“窗口”的概念。)
【解决方案2】:
- 将
OnClick方法转换为WebMethod,返回url而不是重定向到它。
- 通过
OnClientClick 事件从 JavaScript 调用 WebMethod,返回 true/false 以导致 OnClick 仅在调用成功时触发,如果成功则更新隐藏字段值
- 新的
OnClick 事件 Response.Redirects 到 hiddenfields 值