当一个网页中既有数据验证控件,又有一个按钮在点击时出现提示按钮。
如果直接在页面的后台代码的Page_Load函数中写入btn.Attributes["Onclick"] = "return confirm('确定要保存数据?')",那么验证控件就会失效,因为验证控件也是通过js实现的,这样的话return confirm('确定要保存数据?')先于原来的js代码执行,提前返回了,于是验证控件失去了作用。
Html生成的源码如下:
<input type="submit" name="ctl00$ContentPlaceHolder1$bt_save" value="保存数据" οnclick="return confirm('确定要保存数据吗?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ContentPlaceHolder1$bt_save", "", true, "", "", false, false))" id="ctl00_ContentPlaceHolder1_bt_save" />
一开始我错认为把return去掉就可以了,后来发现这样是不行的,原因是没有return的值,确认框也就没有了作用,不管是确定还是取消,都会执行后台代码。
然后我们重新分析一下,这几段代码的实现。
1.我们在后台中加入的Onlick事件的代码默认加到数据验证js方法的前面。
2.我们需要confirm的return值。
3.不能在验证控件的js方法调用前返回。
第2,3条已经没有办法改变了,只能在第一条上突破,于是我将Html中生成的验证控件js方法的调用代码也加到后台中,并且放到return confirm()之前,这样就能保证我们的功能了:
后台代码如下:t_save.Attributes["OnClick"] = "WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('ctl00$ContentPlaceHolder1$bt_save', '', true, '', '', false, false));return confirm('保存吗?')" ;
(注意此处必须将html中的"都替换为 ‘ );
这样做之后,html生成的代码变成了:
<input type="submit" name="ctl00$ContentPlaceHolder1$bt_save" value="保存数据" οnclick="WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('ctl00$ContentPlaceHolder1$bt_save', '', true, '', '', false, false));return confirm('保存吗?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ContentPlaceHolder1$bt_save", "", true, "", "", false, false))" id="ctl00_ContentPlaceHolder1_bt_save" />
显然验证控件js方法调用了两次,但在第二次之前我们就已经return 了,所以没关系;
以上是我在很无奈的时候想到的办法,如果有哪位高人还有其他好的解决方案,希望多多指教