好的..这很难解释,所以在这里。
我有一个包含许多控件的更新面板。更新面板由名为ddlUSCitizenshipStatus的下拉列表的OnSelectedIndexChanged事件触发。当我选择一个新项目时,它按预期工作。
但是,如果我将ddlUSCitizenshipStatus保留为默认值,然后单击页面上的“提交”按钮,则requiredfieldvalidators表示ddlUSCitizenshipStatus上存在错误(它应该,因为我从未选择过值)。然后我选择一个值,错误消息在ddlUSCitizenshipStatus上消失,但更新面板不刷新。我在本地调试了这个,并且ddlUSCitizenshipStatus的OnSelectedIndexChanged事件不会触发。
如果我再次在ddlUSCitizenshipStatus列表中选择一个项目,则会触发OnSelectedIndexChanged服务器事件,并且更新面板将刷新并按预期工作。
问题是,我必须在验证失败后两次在ddlUSCitizenshipStatus中选择一个项目,然后再更新它所在的updatepanel。
页面上的提交按钮如下所示:
<asp:LinkButton ID="btnSubmitPage1" runat="server" CssClass="continueButton" OnClick="btnSubmitPage1_Click" CausesValidation="true" OnClientClick="javascript: return ValidatePage();" />
如果我删除自定义的OnClientClick脚本,请将提交按钮看起来像这样:
<asp:LinkButton ID="btnSubmitPage1" runat="server" CssClass="continueButton" OnClick="btnSubmitPage1_Click" CausesValidation="true" ValidationGroup="valGrpAdditionalInformation" />
下拉列表,更新面板和reguiredfieldvalidator都按预期工作。但是,我需要在单击按钮时运行该自定义“ValidatePage()”脚本。
以下是我的ValidatePage脚本的样子。我一直在排除故障的时间超过我的数量......我希望有人能够帮助我。如果你能弄清楚为什么ddlUSCitizenshipStatus在验证失败后第二次点击之前不会更新updatepanel,请告诉我。
function ValidatePage()
{
var blnDoPostBack = true;
if (typeof(Page_ClientValidate) == 'function' )
{
//Client side validation can occur, so lets do it.
//Validate each validation group.
for( var i = 0; i < Page_ValidationSummaries.length; i++ )
Page_ClientValidate( Page_ValidationSummaries[i].validationGroup.toString() );
//Validate every validation control on the page.
for (var i = 0; i < Page_Validators.length; i++)
ValidatorValidate(Page_Validators[i]);
//Figure out which validation groups have errors, store a list of these validation groups in an array.
var aryValGrpsWithErrors = [];
for( var i = 0; i < Page_Validators.length; i++ )
{
if( !Page_Validators[i].isvalid )
{
//This particular validator has thrown an error.
//Remeber to not do a postback, as we were able to catch this validation error client side.
blnDoPostBack = false;
//If we haven't already registered the validation group this erroring validation control is a part of, do so now.
if( aryValGrpsWithErrors.indexOf( Page_Validators[i].validationGroup.toString() ) == -1 )
aryValGrpsWithErrors[aryValGrpsWithErrors.length++] = Page_Validators[i].validationGroup.toString();
}
}
//Now display every validation summary that has !isvalid validation controls in it.
for( var i = 0; i < Page_ValidationSummaries.length; i++ )
{
if( aryValGrpsWithErrors.indexOf( Page_ValidationSummaries[i].validationGroup.toString() ) != -1 )
{
Page_ValidationSummaries[i].style.display = "";
document.getElementById( Page_ValidationSummaries[i].id.toString() + "Wrapper" ).style.display = "";
}
else
{
//The current validation summary does not have any error messages in it, so make sure it's hidden.
Page_ValidationSummaries[i].style.display = "none";
document.getElementById( Page_ValidationSummaries[i].id.toString() + "Wrapper" ).style.display = "none";
}
}
}
return blnDoPostBack;
}
答案 0 :(得分:1)
我找到了这个问题的解决方案,并在此处发布: http://forums.asp.net/t/1554406.aspx 这篇文章得到了我一直在寻找的答案:http://lionsden.co.il/codeden/?p=137&cpage=1#comment-143
什么是Page_BlockSubmit
当用户点击导致完整回发的按钮时,在运行Page_ClientValidate后,ASP.NET运行另一个内置函数ValidatorCommonOnSubmit。在Page_ClientValidate中,Page_BlockSubmit基于验证设置。如果Page_BlockSubmit为true,则在ValidatorCommonOnSubmit中阻止回发。无论如何,在函数结束时,Page_BlockSubmit总是重置为false。
如果页面执行部分回发而未运行任何验证且Page_BlockSubmit尚未重置为false,则将阻止部分回发。实质上,上述函数RunValidation的作用类似于ValidatorCommonOnSubmit。它运行验证,然后返回false以阻止回发(如果需要)。由于内置回发永远不会运行,我们需要在返回验证结果之前手动重置Page_BlockSubmit。
调用Page_ClientValidate后,变量Page_BlockSubmit将设置为true,从而阻止autopost返回。由于我仍然不完全理解的原因,Page_BlockSubmit在第二次点击时被重置为false。我正在寻找更多,但我有一个解决方案,我在枪下,所以我正在努力。
总之,我之前有以下代码:
for( var i = 0; i < Page_ValidationSummaries.length; i++ )
Page_ClientValidate( Page_ValidationSummaries[i].validationGroup.toString() );
在下面添加Page_BlockSubmit = false
,我明白了:
for( var i = 0; i < Page_ValidationSummaries.length; i++ )
Page_ClientValidate( Page_ValidationSummaries[i].validationGroup.toString() );
Page_BlockSubmit = false;
允许AutoPostBack = true控件在updatepanels内执行。但是,表单本身仍然没有提交,因为只要单个页面验证器具有无效值,我的客户端验证代码就会返回false。
答案 1 :(得分:0)
我遇到了同样的问题,尽管我只有一个使用RangeValidator的Textbox,还有一个提交按钮。当用户输入范围之外的数字并单击“提交”时,会出现无效编号消息。如果他们将数字更改为有效数字并再次单击“提交”,则消息消失,但onclick事件未触发。如果他们第二次点击“提交”则会触发。
我不得不从RangeValidator中删除Display =“Dynamic”属性来修复它。