ASP.NET CustomValidator不工作,始终返回True

时间:2015-08-17 20:25:53

标签: javascript asp.net validation

我尝试使用自定义验证程序验证两个下拉列表。这是我的代码:

  <script type="text/javascript">

    function customValidation(sender, eventArgs)
    {

      var customValidator = document.getElementById('<%=customValidator.ClientID%>');
      var ddl1 = document.getElementById('<%=ddl1.ClientID%>');
      var ddl2 = document.getElementById('<%=ddl2.ClientID%>');

      if (ddl1.selectedIndex > 2 && ddl2.selectedIndex == 1)
      {

        customValidator.isvalid = false;
        ValidatorUpdateDisplay(customValidator);
        return false;

      }
      else
      {

        customValidator.isvalid = true;
        ValidatorUpdateDisplay(customValidator);
        return true;

      }

    }

  </script>

<form id="form1" runat="server">

  <asp:DropDownList ID="ddl1" runat="server">

    <asp:ListItem Selected="True" Value="0">--Select--</asp:ListItem>
    <asp:ListItem Value="1">1</asp:ListItem>
    <asp:ListItem Value="2">2</asp:ListItem>
    <asp:ListItem Value="3">3</asp:ListItem>
    <asp:ListItem Value="4">4</asp:ListItem>
    <asp:ListItem Value="5">5</asp:ListItem>

  </asp:DropDownList>

  <asp:DropDownList ID="ddl2" runat="server">

    <asp:ListItem Selected="True" Value="0">--Select--</asp:ListItem>
    <asp:ListItem Value="1">A</asp:ListItem>
    <asp:ListItem Value="2">B</asp:ListItem>
    <asp:ListItem Value="3">C</asp:ListItem>
    <asp:ListItem Value="4">D</asp:ListItem>
    <asp:ListItem Value="5">E</asp:ListItem>

  </asp:DropDownList>

  <asp:CustomValidator ID="customValidator" runat="server" ClientValidationFunction="customValidation" ErrorMessage="Error." Display="Dynamic" />

</form>

当用户在第一个下拉列表中选择大于2的索引时,验证器应该失败,然后选择&#39; A&#39;在第二个下拉列表中。我试图避免回发,所以我没有服务器验证功能。我不认为这很重要,因为如果验证器失败,那么它就不会允许任何提交按钮工作。

问题在于它不起作用。即使验证只返回true或false,它似乎也没有改变任何东西。我一直在使用Chrome的检查元素来跟踪Javascript的执行情况,并且我发现了一些有趣的内容。

为了测试它,我尝试选择应该返回false的选项。我看到它通过验证功能,逻辑工作正常。调用ValidatorUpdateDisplay时,它确实显示自定义验证程序的错误消息。

但后来我看到执行是在ValidatorValidate()中。然后调用此函数:

val.isvalid = val.evaluationfunction(val);

这会将val.isvalid重置为true,即使我之前将其设置为false。

然后调用ValidatorUpdateDisplay,验证器再次变为不可见。

我不知道为什么要调用ValidatorValidate(),但既然如此,为什么它不会进入自定义验证功能呢?我无法看到它发现的真实位置。

编辑:我心软了,并在服务器端方法中添加。它查看相同的下拉列表并执行与以前相同的逻辑。但现在它被正确显示为无效。当然,这发生在回发后,我并不是真的想要。

如何才能在客户端正确验证?每次执行验证时,它都会正确执行一次,然后由于某种原因再次调用,并始终返回true。它动态地消失得很好,再次让我相信这总是会回归真实。

2 个答案:

答案 0 :(得分:1)

快速查看文档

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator.clientvalidationfunction(v=vs.110).aspx

它看起来会修改传递给验证方法的参数对象的isValid属性作为参数。

您确定通过从方法返回值来设置验证结果吗?

答案 1 :(得分:0)

  

我不知道为什么要调用 ValidatorValidate(),但既然如此,   为什么不进入自定义验证功能?我看不到   它找到了真实的地方。

  • 您提到的ValidatorValidate()函数在Page_ClientValidate()内部被调用,在您提交时会被调用。
  • ValidatorUpdateDisplay()在ValidatorValidate()
  • 中被调用
  • 所以你的javascript代码,当浏览器执行val.evaluationfunction(val)时会被调用,可能会抛出一个错误,导致ValidatorUpdateDisplay()停止执行。