您的位置:首页 > 其它

CustomValidator控件使用心得

2008-11-27 02:23 204 查看
  前两天在博问上提过一个关于Custom Validation 控件使用的问题结果没有人给与回答。

  具体场景如下:

  1、需要从javascript异步调用服务端的方法才能确定是否校验通过。

  2、配合使用了.net提供的CustomValidator 控件

  如果你遇到和我类似的情况,解决的第一想法可能和我一样。首先会使用全局变量把argument的值存入,然后在成功返回的回调函数中将它的IsValid置为false(当然也可能设为true,但这里为了展现我们的问题就假设它校验一直不成功,始终置为false)。

具体代码如下

<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部分到底是如何工作的。

custom validator简要工作流程
  我们可以看在页面添加custom validator control后,会在页面的javascript置入了ValidatorOnLoad(),以备在页面载入时运行。其实这方法就是custom validator control 最初始的入口,它为以后的校验工作打下了基础。整个执行顺序大致如下:

  ValidatorOnLoad()->ValidatorHookupControlID(controlID, val)->ValidatorHookupControl(ctrl, val)最终在ValidatorHookupControl方法将ValidatorOnChange(event) attach到我们被校验控件(就是上边的TextBox1)的onchange事件中。

  下边我们再看看ValidatorOnChange(event)又干了啥。 ValidatorOnChange方法也就是当我们change了TextBox1输入值时就会调用它。我们看看它一路下来调用了哪些方法,及各方法的作用。

  ValidatorOnChange->ValidatorValidate(val,null, event)(如果有多种校此方法会调用多次,当然每次val的值就不一样了)->CustomValidatorEvaluateIsValid(val)->ValidatorUpdateDisplay(val)->ValidatorUpdateIsValid()。跟到CustomValidatorEvaluateIsValid方法我们可以看到它才是最终调用clientvalidationFunction指定的自定义javascript方法,通过自定义的方法更改了argument的IsValid属性后,ValidatorUpdateDisplay会根据该值是否要更ErrorMessage的style的visibility值的以确定显示校验错误提示信息。

  了解这个过程后,我们就可以很清楚的明白为何我们开始那样做是不行的了,因为调用服务器的方法是异步的,所以该方法的下边语句并不会等你执行完,而是并行处理的,所以等从服务器端取回值后,再去给argument.IsValid赋值已是错过班车了。所我们解决的办法就是在回调的方法里边手动再将validateOnChange执行一遍,或者是其中的某些方法。本人在解决的这个问题时,只是在回调函数中依次调用了ValidatorValidate(val,null, event)->ValidatorUpdateDisplay(val)->ValidatorUpdateIsValid()。就得到我所要的结果。大致就是这样,可能具体的问题还要具体去分析。不过个人认为了解custom validator contol的client部分的来胧去脉,对于理解整个.net提供的的校验控件的工作原理会有较大的帮助。

以上仅仅是个人浅易理解,不妥之处请指证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: