【问题标题】:.NET CustomValidator: Prevent Submit Button.NET CustomValidator:阻止提交按钮
【发布时间】:2023-04-05 01:18:01
【问题描述】:

我正在尝试将自定义字段验证器添加到一些遗留代码。如果电子邮件不属于某个域,它应该阻止表单触发。

这是我的标记。

<asp:Textbox id="tbEmail" autocomplete="off" CssClass="txt260" runat="server" TabIndex="1"></asp:Textbox>          
<asp:RequiredFieldValidator id="rfvEmail" runat="server" Display="Dynamic" ForeColor="" ControlToValidate="tbEmail" ErrorMessage="Required" CssClass="ValidatorError">Required</asp:RequiredFieldValidator>
<asp:CustomValidator id="cfvEmail" runat="server" Display="Dynamic" ControlToValidate="tbEmail" ErrorMessage="Invalid Email" CssClass="ValidatorError" OnServerValidate="tbEmail_CustomValidate"></asp:CustomValidator>
<asp:RegularExpressionValidator id="regExpEmail" runat="server" Display="Dynamic" ForeColor="" ControlToValidate="tbEmail" ErrorMessage="Invalid" CssClass="ValidatorError"></asp:RegularExpressionValidator>

...

<asp:Button ID="bSubmit" Text=" CREATE ACCOUNT " CssClass="NewButton" runat="server" OnClientClick="DisabledUpdateButton()" OnClick="bSubmit_Click" />

这是 C# 代码:

protected void tbEmail_CustomValidate(object source, ServerValidateEventArgs args)
{
    List<string> approvedEmailDomains = new List<string>()
    {
        "domainnameihid.com"
    };

    if (!approvedEmailDomains.Any(x => tbEmail.Text.EndsWith(x)))
    {
        args.IsValid = false;
    }
}

当我写一个无效的域名时,代码落入args.IsValid = false。一旦 args.IsValid 为假,它仍然会继续触发提交按钮。必需和常规字段验证器没有。如何让 CustomValidator 阻止按钮的 OnClick 触发或继续?

【问题讨论】:

    标签: c# asp.net .net webforms


    【解决方案1】:

    您还需要创建客户端验证。您可以使用验证器的ClientValidationFunction 来执行此操作。

    <asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="tbEmail"
       ClientValidationFunction="allowedDomains" ErrorMessage="Not Valid"></asp:CustomValidator>
    
    <script type="text/javascript">
        function allowedDomains(sender, element) {
            var approvedDomains = ['<%= string.Join("', '", approvedEmailDomains) %>'];
            element.IsValid = $.inArray(element.Value, approvedDomains) > -1;
        }
    </script>
    

    为此,您需要一个public 列表

    public List<string> approvedEmailDomains;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        approvedEmailDomains = new List<string>()
        {
            "domainnameihid.com",
            "stackoverflow.com"
        };
    }
    

    【讨论】:

    • 那么如果我在客户端这样做,为什么服务器端验证会完成?
    • 我明白了,所以在 ServerValidation 中,即使 args.IsValid 为假,它实际上不会在回发之前停止,而回发直到按钮的 OnClick 之后才会触发?
    • 是的。那就是它的意思。因此,为了获得更好的用户体验,请同时进行客户端和服务器验证,因为如果用户禁用 javscript,客户端可能会被忽略。
    • 感谢您的信息。我刚刚尝试了这个解决方案,它确实阻止了点击,但它不再接受我的有效域。我使用相同的 javascript 将“test.com”作为已批准的电子邮件域,但是当我尝试放入 @test.com 时,它告诉我无效电子邮件
    • 今晚晚些时候,我可以考虑更新答案。但你也可以尝试自己调整它。重要的是使用 ClientValidationFunction 并返回 element.IsValid 真或假。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2011-10-15
    • 2016-01-16
    相关资源
    最近更新 更多