第一次在 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" />

我希望有一个更简洁的解决方案。