【问题标题】:asp.net CustomValidator never fires OnServerValidateasp.net CustomValidator 从不触发 OnServerValidate
【发布时间】:2010-12-11 16:34:58
【问题描述】:

我有以下 ASP 页面:

<asp:Content ID="Content2" ContentPlaceHolderID="ShellContent" runat="server">
    <form runat="server" id="AddNewNoteForm" method="post"">

        <fieldset id="NoteContainer">
            <legend>Add New Note</legend>
            <asp:ValidationSummary ID="ValidationSummary1" runat="server" />
            <div class="ctrlHolder">
                <asp:Label ID="LabelNoteDate" runat="server" Text="Note Date" 
                    AssociatedControlID="NoteDateTextBox"></asp:Label>
                <asp:TextBox ID="NoteDateTextBox" runat="server" class="textInput" 
                    CausesValidation="True" ></asp:TextBox>
                <asp:CustomValidator 
                        ID="CustomValidator1" 
                        runat="server" 
                        ErrorMessage="CustomValidator" 
                        ControlToValidate="NoteDateTextBox" 
                        OnServerValidate="CustomValidator1_ServerValidate" 
                        Display="Dynamic" 
                        >*</asp:CustomValidator>
            </div>
            <div class="ctrlHolder">
                <asp:Label ID="LabelNoteText" AssociatedControlID="NoteTextTextBox" runat="server" Text="Note"></asp:Label>
                <asp:TextBox ID="NoteTextTextBox" runat="server" Height="102px" 
                    TextMode="MultiLine" class="textInput" ></asp:TextBox>
                <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" 
                    ErrorMessage="Note Text is Required" ControlToValidate="NoteTextTextBox">*</asp:RequiredFieldValidator>   

            </div>
            <div class="buttonHolder">
                <asp:Button ID="OkButton" runat="server" Text="Add New Note"  
                    CssClass="primaryAction" onclick="OkButton_Click"/>
                <asp:HyperLink ID="HyperLink1" runat="server">Cancel</asp:HyperLink>
            </div>
        </fieldset>
    </form>
</asp:Content>

以及 CustomValidator1_ServerValidate() 方法的以下代码:

    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {

        if (string.IsNullOrEmpty(args.Value.Trim()))
        {
            args.IsValid = false;
            CustomValidator1.ErrorMessage = "Note Date is Required!";
            return;
        }

        DateTime testDate;
        if (DateTime.TryParse(args.Value, out testDate))
        {
            args.IsValid = true;
            CustomValidator1.ErrorMessage = "Invalid Date!";
        }

    }

无论我在文本框中输入什么,它似乎都不会通过验证...

应该提到这是 ASP.NET 2.0

【问题讨论】:

    标签: asp.net validation .net-2.0 webforms


    【解决方案1】:

    当您测试文本框是否为空时,请在 CustomValidator 上使用此 ValidateEmptyText="true"。

    否则必填字段验证将不起作用。

    【讨论】:

    • 这个答案给你一个惊喜 - 错过了这个属性,在我的情况下,该字段并不总是需要,因此与 requiredvalidator 耦合不是解决方案。
    【解决方案2】:

    为了使用自定义验证器,您还需要一个用于同一控件的 requiredfieldvalidator。只需为 NoteDateTextBox 添加一个 requiredfieldvalidator,它就会为您触发 customvalidator 的服务器事件。

    【讨论】:

    • 您需要RequiredFieldValidator 才能使用CustomValidator 是不正确的。请参阅@Campinho 的回答。
    【解决方案3】:

    添加到 Dan 的回复中,使用 CustomValidator 的另一种方法是:

    • 删除ControlToValidate 属性
    • 在您的 OnServerValidate 方法中,引用您正在验证的控件而不是使用 ServerValidateEventArgs.Value,例如

    示例

    前面的代码

    <asp:ValidationSummary runat="server" DisplayMode="BulletList" ValidationGroup="form" />
    
    <asp:TextBox runat="server" ID="_textbox"/>
    <asp:CustomValidator runat="server" 
            ErrorMessage="Please enter the secret" 
            OnServerValidate="TextBoxValidate"
            ValidationGroup="form" 
            Display="None"
            EnableClientScript="false" />
    <asp:button runat="server" OnClick="ButtonClick" Text="Press" />
    

    后面的代码

    protected void ButtonClick(object sender, EventArgs e)
    {
        Page.Validate();
    
        if (Page.IsValid)
        {
            // Do something
        }
    }
    
    protected void TextBoxValidate(object sender, ServerValidateEventArgs args)
    {
        args.IsValid = _textbox.Text == "secret";
    }
    

    【讨论】:

    • 如果存在没有设置其 controltovalidate 属性的验证控件,则不会加载表单。您将收到一个例外。
    • @dan 自定义验证器不是必需的。我已经更新了我的答案以显示这一点。
    【解决方案4】:

    我有一个类似的问题,没有验证空白条目;把它放在这里是因为这是我搜索的内容。

    我的解决方案是属性:ValidateEmptyText="true"

    【讨论】:

      【解决方案5】:

      当您调用验证时,请确保验证器是 Visible。就我而言,我只在DataBind 期间将父控件设置为Visible,这为时已晚。验证器继承了Visible 值并且始终被认为是有效的。 顺便说一下,这是任何服务器端验证器的要求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多