Page_ClientValidate 正在验证多次。
Posted
技术标签:
【中文标题】Page_ClientValidate 正在验证多次。【英文标题】:Page_ClientValidate is validating multiple times. 【发布时间】:2010-11-01 10:51:19 【问题描述】:我遇到的问题是,验证摘要消息(警报)显示两次。我想不通原因。
请帮忙。 这是代码
function validate() //javascript function
if (typeof(Page_ClientValidate) == 'function')
var isPageValid = Page_ClientValidate();
if(isPageValid)
<asp:Button ID="btn1" runat="server" OnClientClick="validate()" Text="button"
ValidationGroup="ContactGroup" />
<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode="List"
ShowMessageBox="true" ShowSummary="false" ValidationGroup="ContactGroup" />
【问题讨论】:
验证摘要好像多了两个。 【参考方案1】:删除按钮的单击事件,我认为这会强制进行第二次验证。
【讨论】:
【参考方案2】:去掉按钮的onclientclick事件就不需要了
【讨论】:
【参考方案3】:无需手动调用Page_ClientValidate
函数,除非您想在回发尝试之外进行验证。
将按钮 CausesValidation 设置为 true
。这将运行验证。
【讨论】:
【参考方案4】:首先,您应该从按钮中丢失ValidationGroup="ContactGroup"
,因为其中包含验证组将首先调用页面上的验证,然后是包含验证函数的OnClientClick
事件,该事件将再次调用页面验证.
然后您应该将验证组“ContactGroup”传递给Page_ClientValidate()
函数,以便它知道要验证哪些控件,因为只需调用Page_ClientValidate()
将验证所有控件,而不管它们的验证组如何(并且它可能会显示更多验证消息不止一次,具体取决于您拥有多少个验证组。
简而言之,做这样的事情:
function validate() //javascript function
if (typeof(Page_ClientValidate) == 'function')
var isPageValid = Page_ClientValidate('ContactGroup');
if(isPageValid)
//your custom code
<asp:textbox id="txtMyBox" runat="server"/>
<asp:requiredFieldValidator Id="rfv1" runat="server" ControlToValidate="txtMyBox"
ValidationGroup="ContactGroup" ErrorMessage="Bad!"/>
<asp:Button ID="btn1" runat="server" OnClientClick="validate()" Text="button"/>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode="List"
ShowMessageBox="true" ShowSummary="false" ValidationGroup="ContactGroup" />
【讨论】:
【参考方案5】:只需从函数中返回 false 并更改 OnClientClick,如下所示:
<asp:Button ID="btn1" runat="server" OnClientClick="return validate();" Text="button"
ValidationGroup="ContactGroup" />
function validate() //javascript function
if (typeof(Page_ClientValidate) == 'function')
var isPageValid = Page_ClientValidate();
if(isPageValid)
return false;
【讨论】:
【参考方案6】:问题在于函数 Page_ClientValidate 需要一个输入参数,如果您不指定输入,那么每个组名都会触发一次验证摘要。
在您的情况下,该函数触发两次:一次用于 groupname="ContactGroup",另一次用于 groupname=""
你应该改变
var isPageValid = Page_ClientValidate();
到
var isPageValid = Page_ClientValidate('');
如果您不想指定 ValidationGroup,或者如果您想指定组名,那么您需要像这样调用 Page_ClientValidate:
var isPageValid = Page_ClientValidate('ContactGroup');
【讨论】:
【参考方案7】:您可以在不显示消息的情况下进行验证,使用以下代码段,然后使用 isPageValid 变量:
if (Page_ValidationSummaries && Page_ValidationSummaries[0] && Page_ValidationSummaries[0].showmessagebox)
var showMessagesOption = Page_ValidationSummaries[0].showmessagebox;
Page_ValidationSummaries[0].showmessagebox = "False";
isPageValid = Page_ClientValidate();
Page_ValidationSummaries[0].showmessagebox = showMessagesOption;
【讨论】:
【参考方案8】:我知道这是一篇旧帖子,但这里有一个可能更灵活的解决方案。与其他用户的建议类似,此解决方案接受默认情况下由 asp.net 验证控件传递的验证组。这样您就不需要在 Button 控件上添加OnClientClick="validate()"
。
//Make sure the Page_ClientValidate function exists
if (typeof (Page_ClientValidate) == "function")
//Stash the old implementation in a temp variable
Page_ClientValidateOld = Page_ClientValidate;
//Create a new implementation and store it
//in Page_ClientValidate. Callers will now get
//this implementation.
Page_ClientValidate = function (validationGroup)
var isValid;
//Call the old implementation first…
isValid = Page_ClientValidateOld(validationGroup);
//and then call our extension
if (!isValid)
// Do something
return isValid;
如果您想了解有关此方法的更多信息,我建议您查看此博客文章: http://hyperthink.net/blog/interception-patterns-in-javascript/
【讨论】:
以上是关于Page_ClientValidate 正在验证多次。的主要内容,如果未能解决你的问题,请参考以下文章
Page_ClientValidate 未定义 (ASP.NET MVC)
[转]Dropdownlist doesn't postback after Page_ClientValidate()