Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET CustomValidator:阻止提交按钮_C#_Asp.net_.net_Webforms - Fatal编程技术网

C# .NET CustomValidator:阻止提交按钮

C# .NET CustomValidator:阻止提交按钮,c#,asp.net,.net,webforms,C#,Asp.net,.net,Webforms,我正在尝试向一些遗留代码添加自定义字段验证器。如果电子邮件不属于某个域,则应防止表单触发 这是我的标记 <asp:Textbox id="tbEmail" autocomplete="off" CssClass="txt260" runat="server" TabIndex="1"></asp:Textbox> <asp:RequiredFieldValidator id="rfvEmail" runat="server" Display="D

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

这是我的标记

<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>

要求的


以下是C#代码:

protectedvoid tbEmail\u CustomValidate(对象源,ServerValidateEventArgs args)
{
List approvedEmailDomains=新列表()
{
“域名ihid.com”
};
如果(!approvedEmailDomains.Any(x=>tbEmail.Text.EndsWith(x)))
{
args.IsValid=false;
}
}

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

您还需要创建客户端验证。您可以使用验证器的
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>

那么,如果我在客户端执行此操作,为什么服务器端验证会完成?我明白了,所以在ServerValidation中,即使args.IsValid为false,它实际上也不会在回发之前停止,而回发直到单击按钮后才会触发?是的。这就是它的意思。因此,为了获得更好的用户体验,请同时进行客户端和服务器验证,因为如果用户禁用javscript,客户端可能会被用户忽略。谢谢您提供的信息。我刚刚尝试了这个解决方案,它确实阻止了点击,但它不再接受我的有效域。我使用相同的javascript将“test.com”作为approvedEmailDomain,但当我尝试输入@test.com时,它告诉我今晚晚些时候无效的电子邮件,我可以考虑更新答案。但是你也可以试着自己调整一下。重要的是使用
ClientValidationFunction
并返回
元素。IsValid
true或false。
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;
    }
}
<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 List<string> approvedEmailDomains;

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