社区编辑申请
注册/登录
ASP.NET1.1、ASP.NET2.0、ASP.NET3.5中验证控件等问题
开发 后端
本文解决了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”, 即 

  1. < asp:Button ID="Button1" runat="server" Text="Button"  CausesValidation="False"  OnClick="clickme" /> 

其实,CausesValidation="False/True"都不会有任何影响。

接着,在后台代码的Page_Load事件中,注册客户端的onclick事件。

方法1:

  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.         Button1.OnClientClick = ClientScript.GetPostBackEventReference(  
  4.             new PostBackOptions(Button1, """"falsetruefalsefalsetrue""))   
  5.             + ";return (Page_IsValid && confirm('Are you sure to continue?'));";   
  6.     }  

这里要特别注意的一个地方是,不能把它放在if(!isPostBack) {...}的里面,否则,***次正常,下一次开始就会报

Microsoft JScript 运行时错误: 'WebForm_PostBackOptions' 未定义

即要求每触发一次,都要重新注册一次onclick事件。

昨天测试的时候有这个问题,可能是VS2008安装的有问题的缘故(设计模式就无法显示),

今天测试了下,可以只注册一次,即页面加载时,如下: 

  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.         if (!IsPostBack)  
  4.         {  
  5.             Button1.OnClientClick = ClientScript.GetPostBackEventReference(  
  6.                 new PostBackOptions(Button1, """"falsetruefalsefalsetrue""))  
  7.                 + ";return (Page_IsValid && confirm('Are you sure to continue?'));";  
  8.         }  
  9.           
  10.     }  

验证控件方法2:

  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.         if (!IsPostBack)  
  4.         {  
  5.             Button1.OnClientClick = "javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('Button1', '', true, '', '', false, false));return (Page_IsValid && confirm('Are you sure to continue?'));WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('Button1', '', true, '', '', false, false))";  
  6.         }  
  7.     }  

其实,方法1运行后,在客户端html中生成的onclick代码就是方法2中的代码。

若是用方法2的方法在后台直接写javascript字符串,则可以去掉***一句,不然,就多了一次验证了。即如下:

  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.         if (!IsPostBack)  
  4.         {  
  5.             Button1.OnClientClick = "javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('Button1', '', true, '', '', false, false));return (Page_IsValid && confirm('Are you sure to continue?'));";  
  6.         }  
  7.     }  

方法1每次点击按钮之前都要在page_load中注册一次,而方法2只要在page_load中注册一次就够了。

vb.net与C#生成的html客户端代码有点点不同

  1. Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load  
  2.         If Not Me.Page.IsPostBack Then  
  3.             Me.Button1.OnClientClick = "javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('Button1', '', true, 'name', '', false, false));return (Page_IsValid && confirm('Are you sure to continue?'));" 
  4.         End If  
  5.     End Sub  

  1. Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender  
  2.         If Not Me.Page.IsPostBack Then  
  3.             'VB.NET中要把下面这句放在Page_PreRender里,不能放在Page_Load中,且只需要注册一次就可以了  
  4.             '在生成html的客户端代码中,比C#少了一部分代码。  
  5.             Me.Button1.OnClientClick = Me.Page.ClientScript.GetPostBackEventReference(New System.Web.UI.PostBackOptions(Me.Button1, """", False, True, False, False, True, "name")) & _  
  6.             ";return (Page_IsValid && confirm('Are you sure to continue?'));" 
  7.         End If  
  8.     End Sub  

asp.net2.0和asp.net3.5的介绍完了,下面介绍asp.net 1.1里的解决方案

首先也是将button的CausesValidation=“false”, 即

  1. < asp:Button ID="Button1" runat="server" Text="Button"  CausesValidation="False"  OnClick="clickme" /> 

接着,在后台代码的Page_Load事件中,注册客户端的onclick事件。 

  1. private void Page_Load(object sender, System.EventArgs e)  
  2.         {  
  3.             // 在此处放置用户代码以初始化页面  
  4.             if (!this.Page.IsPostBack)  
  5.             {  
  6.                 string msg = "javascript:if (typeof(Page_ClientValidate) == 'function'){ if(Page_ClientValidate()) return window.confirm('Are you sure to continue?');}";  
  7.                 this.Button1.Attributes.Add("onclick",msg);  
  8.             }  
  9.               
  10.         }  

因asp.net1.1中注册onclick代码只包含javascript代码,故可以放在if(!IsPostBack){...} 里面而不会有问题。

这样就会先验证控件,通过了再弹出确认对话框。

【编辑推荐】

  1. ASP.NET MVC分页控件的实现
  2. ASP.NET MVC实例:使用Northwind和Entity框架
  3. 戏说ASP.NET的解释原理
  4. ASP.NET cookie操作心得一览
  5. ASP.NET获得当前插入行主键的代码
责任编辑:book05 来源: cnblogs
相关推荐

2009-02-01 13:57:53

2009-12-02 09:07:45

ASP.NET 4.0

2009-07-27 14:50:24

2009-07-27 17:25:53

2009-08-10 14:08:15

ASP.NET服务器控ASP.NET组件设计

2009-08-07 14:40:36

RegularExprASP.NET验证控件

2009-08-04 15:20:59

ASP.NET数据验证数据验证控件

2009-08-04 17:41:10

ASP.NET数据验证

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入门教程

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2009-08-07 17:49:44

控件设计器

2009-08-01 09:21:12

ASP.NET服务器自ASP.NET服务器控ASP.NET

2009-08-06 18:32:00

ASP.NET控件开发ASP.NET复合控件

2009-08-07 16:18:08

ASP.NET2.0数

2009-07-31 10:01:08

Button与验证控件ValidatorGr

2009-06-08 16:00:00

2009-08-01 20:59:08

ASP.NET服务器控ASP.NET服务器ASP.NET

2009-07-29 11:29:16

ASP.NET1.1ASP.NET2.0

2009-07-21 15:50:47

ASP.NET控件JavaScript

2009-08-05 15:57:03

ASP.NET控件ID

同话题下的热门内容

太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python轻量级Web框架:Bottle库!Python居然被用来开发游戏了?盘点你想不到的Python开发场景用了那么久的Lombok,你知道它的原理么?实战 | 如何用 Python 自动化监控文件夹完成服务部署!Fury:一个基于JIT动态编译的高性能多语言原生序列化框架细思恐极,插上U盘就开始执行Python代码为什么 Python、Ruby 等语言弃用了自增运算符?

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号