分类: JavaScript
2013-10-28 13:53:24
经常会有正样的需求,在用户做一个不易恢复并且容易误操作的动作时需要给用户以提示,用户确认后继续执行动作。
简单的解决方案是:前台用OnClientClick事件中使用Confirm给用弹出确认提示框,用户确认后继续执行后台代码,取消的不做处理。但是最近突然遇到这种方法不灵了,反复确认后发现了button的UseSubmitBehavior属性被设置成了false。类似问题,网上找到了。
以这个帖子为蓝本说明下具体的解决方案,这里只说明帖子中指出的第一种方案:
原有问题代码如下:
解决方法如下:
function CheckDelete() {
if (confirm('你确定要删除XX吗?')) {
return true;
}
else {
return false;
}
}
按钮代码修改如下:
http://www.cnblogs.com/studyever/archive/2012/09/18/2690885.html
---------------------------------------------------------------------------------------------------------------------------------------------
这个是我的aspx页面的button代码 :
我在OnClientClick事件中直接写的返回true,居然服务端的事件OnClick里面也不执行了。
有没有人遇到这个问题帮帮解决下,我也查了很多地方了,都没有好的解决方法。
张占刚工程师 回答:
对于 Server 端的Button,UseSubmitBehavior 非常特殊,我们看一下MSDN对这个属性的描述:
使用 UseSubmitBehavior 属性来指定 Button 控件 使用 客户端浏览器的提交机制 还是 ASP.NET 回发机制。默认情况下,此属性的值为 true,从而导致 Button 控件使用浏览器的提交机制。如果指定为 false,则 ASP.NET 页框架将客户端脚本添加到页面,以将窗体发送到服务器。
如你所描述的:
你设置 UseSubmitBehavior = False,则该 Button 需要采用ASP.NET 回发机制来触发server端的事件,所谓的回发机制,实际就是.NET自动给页面添加了相应的JS代码,并且给这个BUTTON自动添加了客户端的onclick事件。此时,你去看页面输出的HTML源码,会看到下面的类似内容:
//
var theForm = document.forms['ctl01'];
if (!theForm) {
theForm = document.ctl01;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
而这个Button的输出的HTML代码类似下面的:
而你又指定了这个Button的onclientclick事件为 return true,那么.NET页面在自动为BUTTON赋予客户端事件时,会自动判断,并且将这些事件合并到一起执行。此时这个BUTTON的HTML输出变成了下面的样子
你会看到,在__doPostBack 前面,是你自己指定的 return true; 而在JS代码里,return 之后的任何内容都不执行,所以,后面的 __doPostBack 被忽略了,也就是你说的不会触发Server端的事件了。
解决的方法其实很简单:
第一种,给 onclientclick 指定一个函数,而不是简单的 return true;
第二种,将 button 的onclientclick要做的事,放到 form 的 onsubmit 里去做