本文解决了ASP.NET1.1, ASP.NET2.0,ASP.NET3.5中验证控件和自定义弹出确认窗口的冲突问题的。
在asp.net页面中,当有验证控件,并且想在验证控件验证经过之后,弹出一个承认对话框,提示是否持续。
当在button按钮上增加客户端的onclick="return confirm('Are you sure to continue?')"时,验证控件的验证就会失效。由于验证控件也是增加客户端的onclick事情。
在ASP.NET2.0, asp.net3.5中能够运用如下办法处理。(ASP.NET1.1的稍后再说)
首要将button的CausesValidation=“false”, 即
- <asp:ButtonID="Button1"runat="server"Text="Button"CausesValidation="False"OnClick="clickme"/>
其实,CausesValidation="False/True"都不会有任何影响。
接着,在后台代码的Page_Load事情中,注册客户端的onclick事情。
办法1:
- protectedvoidPage_Load(objectsender,EventArgse)
- {
- Button1.OnClientClick=ClientScript.GetPostBackEventReference(
- newPostBackOptions(Button1,"","",false,true,false,false,true,""))
- +";return(Page_IsValid&&confirm('Areyousuretocontinue?'));";
- }
这儿要特别注意的一个当地是,不能把它放在if(!isPostBack) {...}的里边,否则,***次正常,下一次开端就会报
Microsoft JScript 运转时过错: 'WebForm_PostBackOptions' 未定义
即要求每触发一次,都要从头注册一次onclick事情。
昨日测验的时分有这个问题,可能是VS2008装置的有问题的原因(规划形式就无法显现),
今日测验了下,能够只注册一次,即页面加载时,如下:
- protectedvoidPage_Load(objectsender,EventArgse)
- {
- if(!IsPostBack)
- {
- Button1.OnClientClick=ClientScript.GetPostBackEventReference(
- newPostBackOptions(Button1,"","",false,true,false,false,true,""))
- +";return(Page_IsValid&&confirm('Areyousuretocontinue?'));";
- }
- }
验证控件办法2:
- protectedvoidPage_Load(objectsender,EventArgse)
- {
- if(!IsPostBack)
- {
- Button1.OnClientClick="javascript:WebForm_DoPostBackWithOptions(newWebForm_PostBackOptions('Button1','',true,'','',false,false));return(Page_IsValid&&confirm('Areyousuretocontinue?'));WebForm_DoPostBackWithOptions(newWebForm_PostBackOptions('Button1','',true,'','',false,false))";
- }
- }
其实,办法1运转后,在客户端html中生成的onclick代码便是办法2中的代码。
若是用办法2的办法在后台直接写javascript字符串,则能够去掉***一句,否则,就多了一次验证了。即如下:
- protectedvoidPage_Load(objectsender,EventArgse)
- {
- if(!IsPostBack)
- {
- Button1.OnClientClick="javascript:WebForm_DoPostBackWithOptions(newWebForm_PostBackOptions('Button1','',true,'','',false,false));return(Page_IsValid&&confirm('Areyousuretocontinue?'));";
- }
- }
办法1每次点击按钮之前都要在page_load中注册一次,而办法2只要在page_load中注册一次就够了。
vb.net与C#生成的html客户端代码有点点不同
- ProtectedSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.Load
- IfNotMe.Page.IsPostBackThen
- Me.Button1.OnClientClick="javascript:WebForm_DoPostBackWithOptions(newWebForm_PostBackOptions('Button1','',true,'name','',false,false));return(Page_IsValid&&confirm('Areyousuretocontinue?'));"
- EndIf
- EndSub
或
- ProtectedSubPage_PreRender(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.PreRender
- IfNotMe.Page.IsPostBackThen
- 'VB.NET中要把下面这句放在Page_PreRender里,不能放在Page_Load中,且只需要注册一次就能够了
- '在生成html的客户端代码中,比C#少了一部分代码。
- Me.Button1.OnClientClick=Me.Page.ClientScript.GetPostBackEventReference(NewSystem.Web.UI.PostBackOptions(Me.Button1,"","",False,True,False,False,True,"name"))&_
- ";return(Page_IsValid&&confirm('Areyousuretocontinue?'));"
- EndIf
- EndSub
asp.net2.0和asp.net3.5的介绍完了,下面介绍asp.net 1.1里的处理方案
首要也是将button的CausesValidation=“false”, 即
- <asp:ButtonID="Button1"runat="server"Text="Button"CausesValidation="False"OnClick="clickme"/>
接着,在后台代码的Page_Load事情中,注册客户端的onclick事情。
- privatevoidPage_Load(objectsender,System.EventArgse)
- {
- //在此处放置用户代码以初始化页面
- if(!this.Page.IsPostBack)
- {
- stringmsg="javascript:if(typeof(Page_ClientValidate)=='function'){if(Page_ClientValidate())returnwindow.confirm('Areyousuretocontinue?');}";
- this.Button1.Attributes.Add("onclick",msg);
- }
- }
因asp.net1.1中注册onclick代码只包括javascript代码,故能够放在if(!IsPostBack){...} 里边而不会有问题。
这样就会先验证控件,经过了再弹出承认对话框。
【修改引荐】
- ASP.NET MVC分页控件的完成
- ASP.NET MVC实例:运用Northwind和Entity结构
- 戏说ASP.NET的解说原理
- ASP.NET cookie操作心得一览
- ASP.NET取得当时插入行主键的代码