【问题标题】:ASP.NET Custom Validator Client side & Server Side validation not firingASP.NET 自定义验证器客户端和服务器端验证未触发
【发布时间】:2010-10-16 14:34:16
【问题描述】:

这在我之前没有发生过,但由于某种原因,客户端和服务器端验证事件都没有被触发:

<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" />
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true"
    ErrorMessage="Delivery Town or City required"
    ClientValidationFunction="TextBoxDTownCityClient" 
    ControlToValidate="TextBoxDTownCity"
    OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" >
</asp:CustomValidator>

服务器端验证事件:

protected void TextBoxDTownCity_Validate(object source, ServerValidateEventArgs args)
{
    args.IsValid = false;
}

客户端验证事件:

function TextBoxDCountyClient(sender, args) {
    args.IsValid = false;
    alert("test");
}

我认为至少服务器端验证会触发,但不会。这在我以前从未发生过。这真的让我很难过。

我查看了输出,ASP.NET 正在识别客户端功能:

ASP.NET JavaScript 输出:

var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2");

ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity";

ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required";

ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic";

ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid";

ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient";

渲染的自定义验证器:

<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span> 

谁能解释一下为什么客户端和服务器端验证都不会触发。

编辑:错字我粘贴到了错误的函数中,问题还是一样

只是对最后一条评论的另一个更新:TextBox 不能为空。我对此进行了测试,但事实并非如此。在空白页面上,CustomValidator 触发了我的客户端验证功能,但没有值:

<asp:TextBox ID="TextBox1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server" 
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

【问题讨论】:

    标签: c# .net asp.net validation customvalidator


    【解决方案1】:

    使用这个:

    <asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>
    

    验证一个空字段。

    您不需要添加 2 个验证器!

    【讨论】:

    • 我正在寻找的解决方案。谢谢。
    【解决方案2】:

    您的CustomValidator 只会在TextBox 不为空时触发。

    如果您需要确保它不为空,那么您还需要一个 RequiredFieldValidator

    Note: If the input control is empty, no validation functions are called and validation succeeds. Use a RequiredFieldValidator control to require the user to enter data in the input control.

    编辑:

    如果您的 CustomValidator 指定了 ControlToValidate 属性(并且您的原始示例确实如此),那么只有当控件不为空时才会调用您的验证函数。

    如果你不指定ControlToValidate,那么你的验证函数每次都会被调用。

    这为该问题开辟了第二种可能的解决方案。您可以从CustomValidator 中省略ControlToValidate 属性,而不是使用单独的RequiredFieldValidator,并设置您的验证函数来执行以下操作:

    客户端代码(Javascript):

    function TextBoxDCountyClient(sender, args) {
        var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value;
        if (v == '') {
            args.IsValid = false;  // field is empty
        }
        else {
            // do your other validation tests here...
        }
    }
    

    服务器端代码(C#):

    protected void TextBoxDTownCity_Validate(
        object source, ServerValidateEventArgs args)
    {
        string v = TextBoxDTownCity.Text;
        if (v == string.Empty)
        {
            args.IsValid = false;  // field is empty
        }
        else
        {
            // do your other validation tests here...
        }
    }
    

    【讨论】:

    • 对我来说太快了,我正在输入相同的答案:) +1
    • “您的 CustomValidator 只会在 TextBox 不为空时触发”我在一个干净的页面上对此进行了测试,但事实并非如此。即使文本框为空,客户端验证功能也会触发
    • 我的错。我知道我需要做什么。如果我省略 ControlToValidate 属性,那么我会成功完成我想做的事情,并且客户端函数会在我需要时触发。
    • 这是一个很酷的修复方法,对我有用。但是,我使用 Ajax 控件工具包中的 ValidatorCalloutExtender,它需要设置 ControlToValidate 属性。总是有一些东西...... :-(
    • 您还可以使用 CustomValidator.ValidateEmptyText 属性吗? msdn.microsoft.com/en-us/library/…
    【解决方案3】:

    我的 Web 表单上根本没有执行客户端验证,我不知道为什么。事实证明,问题在于 javascript 函数的名称与服务器控件 ID 相同。

    所以你不能这样做......

    <script>
      function vld(sender, args) { args.IsValid = true; }
    </script>
    <asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" />
    

    但这有效:

    <script>
      function validate_vld(sender, args) { args.IsValid = true; }
    </script>
    <asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" />
    

    我猜它与内部 .NET Javascript 冲突?

    【讨论】:

      【解决方案4】:

      您是否验证了导致回发的控件已将 CausesValidation 设置为 tru 并且没有为其分配验证组?

      我不确定还有什么可能导致这种行为。

      【讨论】:

      • 我使用 ImageButton 进行提交,我没有说明任何验证组。
      【解决方案5】:

      还要检查您是否没有使用验证组,因为如果设置了验证组属性并且没有显式调用 via,则验证不会触发

       Page.Validate({Insert validation group name here});
      

      【讨论】:

      • 是的,但是您仍然需要文本框中的文本才能使验证器正常工作!
      【解决方案6】:

      如果客户端验证无效,则不会触发服务器端验证,不会发送回发。

      您没有其他未通过的验证吗?

      客户端验证未执行,因为您指定了ClientValidationFunction="TextBoxDTownCityClient",这将查找名为TextBoxDTownCityClient 的函数作为验证函数,但函数名称应为 TextBoxDAddress1Client

      (如你所写)

      【讨论】:

        【解决方案7】:

        感谢有关 ControlToValidate LukeH 的信息!

        我试图在我的代码中做的是,仅当文本字段 B 具有特定值时,才能确保某些文本字段 A 在字段中具有一些文本。否则, A 可以为空白或其他任何内容。去掉我标记中的 ControlToValidate="A" 为我解决了这个问题。

        干杯!

        【讨论】:

          猜你喜欢
          • 2017-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-27
          • 2023-04-08
          • 2017-01-26
          • 1970-01-01
          相关资源
          最近更新 更多