ASP.NET验证控件和Javascript确认框
我有一个使用.NETs服务器端输入验证控件的页面。此页面还具有一个javascript确认框,该框在提交表单时触发。当前选择的提交按钮时,JavaScript的确认框出现,一旦确认了ASP.NET服务器端验证控件被解雇。我想在显示JavaScript确认框之前触发服务器端验证控件。
如何做到这一点? Ive在下面提供了我当前代码的示例。
sample.aspx
<asp:textbox id=foo runat=server /> <asp:requiredfieldvalidator id=val runat=server controltovalidate=foo /> <asp:button id=submit runat=server onClientClick=return confirm('Confirm this submission?') />
sample.aspx.vb
Sub Page_Load() If Page.IsPostback() Then Page.Validate() If Page.IsValid Then 'process page here' End If End If End Sub
谢谢你的帮助。
解决方案
我们不能为验证器控件使用EnableClientScript属性,从而允许我们在提交提交时在客户端进行验证吗?
事实是,返回确认在验证者的JavaScript之前触发。所有这些都与生命周期和事物有关。
如果我们确实希望拥有这种行为,那么我们需要做的就是将所有验证器更改为自定义验证器,为自定义验证器推出自己的JS验证例程,然后在验证例程作为最终调用。
如果可以更改触发顺序,如果我们将HIJAX方法中的返回确认代码添加到按钮的HIJAX方法中,则在页面完全加载到浏览器中后将其分配给onClick事件-但我从未使用过那种能力的方法论,所以不要在这里引用我。
验证器由表单上的onsubmit处理程序触发。
如果我们覆盖了form.onsubmit,尽管我们可以手动提供所需的JS,但我们将丢失验证器触发。
使用ASP.NET控件工具包的ValidatorCallout控件怎么办?来自:http://www.asp.net/AJAX/AjaxControlToolkit/Samples/ValidatorCallout/ValidatorCallout.aspx
ValidatorCallout是一个ASP.NET AJAX扩展程序,它增强了现有ASP.NET验证程序的功能。要使用此控件,请像往常一样添加一个输入字段和一个验证器控件。然后添加ValidatorCallout并设置其TargetControlID属性以引用验证程序控件。
我没有用过,但是在我看来,它可以为我们提供所需的客户端验证。
检查一下
http://www.codedigest.com/CodeDigest/73-Fire-Validator-Controls-Before-JavaScript-Confirm-Box-Fires-in-ASP-Net-Page.aspx
这似乎是一个非常普遍的问题。
解决方法:
首先验证页面,然后调用"确认",如此处和此处所示。
这样做的缺点是在代码中两次调用验证,并在提交的onclick中在生成的代码中调用一次。
如何使其正常工作,即首先验证页面(并且仅验证一次),然后显示"确认"框,我尚不知道。
编辑:这是一个有用的建议:
What ASP.NET does behind the scenes when validation controls exist, is add an autogenerated onClick event for each button. This OnClick event would supercede the custom OnClick event. So to overcome this I did the following: add CausesValidation = False added Validate() and IsValid code to the onClick event behind the page to simulate the now missing autogenerated validation code behind the button.
编辑2:完整的示例
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="if (Page_ClientValidate()){ return confirm('Do you want to submit this page?')}" CausesValidation="false" />