第一次在 UpdatePanel 中回发时加载控件/验证器时如何使用自定义 ValidatorUpdateDisplay 函数?
How to use a custom ValidatorUpdateDisplay function when the controls / validators are loaded on postback in an UpdatePanel the first time?
在 ASP.NET 中,当使用验证控件(即 RequiredFieldValidator
)时,客户端框架将执行 JS 函数 Page_ClientValidate
。此函数将验证页面上的所有控件(给定 ValidationGroup
)并使用 span
标记的 DOM 元素的参数调用 JS 函数 ValidatorUpdateDisplay
验证者控制。
ValidatorUpdateDisplay
根据验证结果切换 span
标签的可见性。
在我的 Web 应用程序中,我覆盖了 ValidatorUpdateDisplay
JS 函数以在验证场景中提供更多功能(即控件周围的红色边框,在第一个失败的控件上显示弹出窗口并滚动到它)。
现在,在 UpdatePanel 中回发后第一次显示我的控件(包括提交按钮)之前,它工作得很好。
<asp:ScriptManager runat="server" />
<asp:UpdatePanel ID="upTest" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="bShow" runat="server" UseSubmitBehavior="false" Text="SHOW" OnClick="bShow_Click" />
<asp:Panel ID="pContent" runat="server" Visible="false">
<asp:TextBox ID="tbTest" runat="server" />
<asp:RequiredFieldValidator ID="rfvTest" runat="server" ControlToValidate="tbTest" Text="Not valid" />
<asp:Button ID="bTest" runat="server" UseSubmitBehavior="false" Text="TEST" />
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
<script type="text/javascript">
function ValidatorUpdateDisplay(val) {
debugger; // this will not be reached
}
</script>
protected void bShow_Click(object sender, EventArgs e)
{
this.pContent.Visible = true;
}
初始加载后按bShow
显示pContent
。
现在,如果您将 tbTest.Text
留空并按下 bTest
,它应该会进入覆盖的 ValidatorUpdateDisplay
函数,但是它会进入框架的函数并显示 "Not valid" from [=24] =].
如果您将 pContent.Visible
更改为 true
并在初始加载后按 bTest
将会发生所需的效果:它将进入自定义 ValidatorUpdateDisplay
函数并且不显示 "Not valid"。
如果将按钮 bTest
移出 UpdatePanel
,问题仍然存在。
如何让它在 UpdatePanel
中工作?
ASP.NET 使用延迟加载方法在第一次需要时插入 ValidatorUpdateDisplay
函数,因此在我的示例中它将在 [=12= 的回发之后加载函数].
这将覆盖我自己实现的 ValidatorUpdateDisplay
函数,因为它是在页面末尾插入该函数。
有一个肮脏的解决方法,我只是在初始加载时插入了一个始终有效的空 CustomValidator
:
<asp:CustomValidator runat="server" />
我希望有一个更简洁的解决方案。
在 ASP.NET 中,当使用验证控件(即 RequiredFieldValidator
)时,客户端框架将执行 JS 函数 Page_ClientValidate
。此函数将验证页面上的所有控件(给定 ValidationGroup
)并使用 span
标记的 DOM 元素的参数调用 JS 函数 ValidatorUpdateDisplay
验证者控制。
ValidatorUpdateDisplay
根据验证结果切换 span
标签的可见性。
在我的 Web 应用程序中,我覆盖了 ValidatorUpdateDisplay
JS 函数以在验证场景中提供更多功能(即控件周围的红色边框,在第一个失败的控件上显示弹出窗口并滚动到它)。
现在,在 UpdatePanel 中回发后第一次显示我的控件(包括提交按钮)之前,它工作得很好。
<asp:ScriptManager runat="server" />
<asp:UpdatePanel ID="upTest" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="bShow" runat="server" UseSubmitBehavior="false" Text="SHOW" OnClick="bShow_Click" />
<asp:Panel ID="pContent" runat="server" Visible="false">
<asp:TextBox ID="tbTest" runat="server" />
<asp:RequiredFieldValidator ID="rfvTest" runat="server" ControlToValidate="tbTest" Text="Not valid" />
<asp:Button ID="bTest" runat="server" UseSubmitBehavior="false" Text="TEST" />
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
<script type="text/javascript">
function ValidatorUpdateDisplay(val) {
debugger; // this will not be reached
}
</script>
protected void bShow_Click(object sender, EventArgs e)
{
this.pContent.Visible = true;
}
初始加载后按bShow
显示pContent
。
现在,如果您将 tbTest.Text
留空并按下 bTest
,它应该会进入覆盖的 ValidatorUpdateDisplay
函数,但是它会进入框架的函数并显示 "Not valid" from [=24] =].
如果您将 pContent.Visible
更改为 true
并在初始加载后按 bTest
将会发生所需的效果:它将进入自定义 ValidatorUpdateDisplay
函数并且不显示 "Not valid"。
如果将按钮 bTest
移出 UpdatePanel
,问题仍然存在。
如何让它在 UpdatePanel
中工作?
ASP.NET 使用延迟加载方法在第一次需要时插入 ValidatorUpdateDisplay
函数,因此在我的示例中它将在 [=12= 的回发之后加载函数].
这将覆盖我自己实现的 ValidatorUpdateDisplay
函数,因为它是在页面末尾插入该函数。
有一个肮脏的解决方法,我只是在初始加载时插入了一个始终有效的空 CustomValidator
:
<asp:CustomValidator runat="server" />
我希望有一个更简洁的解决方案。