我尝试使用自定义验证程序验证两个下拉列表。这是我的代码:
<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。它动态地消失得很好,再次让我相信这总是会回归真实。
答案 0 :(得分:1)
快速查看文档
它看起来会修改传递给验证方法的参数对象的isValid
属性作为参数。
您确定通过从方法返回值来设置验证结果吗?
答案 1 :(得分:0)
我不知道为什么要调用 ValidatorValidate(),但既然如此, 为什么不进入自定义验证功能?我看不到 它找到了真实的地方。