前两天在博问上提过一个关于Custom Validation 控件使用的问题结果没有人给与回答。
具体场景如下:
1、需要从javascript异步调用服务端的方法才能确定是否校验通过。
2、配合使用了.net提供的CustomValidator 控件
如果你遇到和我类似的情况,解决的第一想法可能和我一样。首先会使用全局变量把argument的值存入,然后在成功返回的回调函数中将它的IsValid置为false(当然也可能设为true,但这里为了展现我们的问题就假设它校验一直不成功,始终置为false)。
具体代码如下
![](/Images/OutliningIndicators/ContractedBlock.gif)
Code
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="CustomValidator" ClientValidationFunction="TestValidate"></asp:CustomValidator>
<script>
var globalArg;
function TestValidate(source, arguments)
{
globalArg=arguments;
callServerMethod("aa",CallSuccess);
}
function CallSuccess(result)
{
globalArg.IsValid=false;
}
</script>
这样行吗?当然是不行了,原因何在,为什么样我们把argument.IsValid=false写在 custom validator的clientvalidationFunction中指定的而的方法中就可以提示校验不过,而放入回调函数就不成了。下边我们先来看custom validator 控件的client部分到底是如何工作的。
了解这个过程后,我们就可以很清楚的明白为何我们开始那样做是不行的了,因为调用服务器的方法是异步的,所以该方法的下边语句并不会等你执行完,而是并行处理的,所以等从服务器端取回值后,再去给argument.IsValid赋值已是错过班车了。所我们解决的办法就是在回调的方法里边手动再将validateOnChange执行一遍,或者是其中的某些方法。本人在解决的这个问题时,只是在回调函数中依次调用了ValidatorValidate(val,null, event)->ValidatorUpdateDisplay(val)->ValidatorUpdateIsValid()。就得到我所要的结果。大致就是这样,可能具体的问题还要具体去分析。不过个人认为了解custom validator contol的client部分的来胧去脉,对于理解整个.net提供的的校验控件的工作原理会有较大的帮助。
以上仅仅是个人浅易理解,不妥之处请指证。