Asp.net 2.0 用户创建的验证程序不会在“复杂”用户控件上调用客户端验证Javascript

Asp.net 2.0 用户创建的验证程序不会在“复杂”用户控件上调用客户端验证Javascript,asp.net-2.0,client-side,validation,Asp.net 2.0,Client Side,Validation,我已经从System.Web.UI.UserControl创建了一个用户控件,并从System.Web.UI.WebControl.BaseValidator为用户控件创建了自己的验证程序。在我尝试让用户控件进行客户端验证之前,一切都正常 在尝试调试这个问题时,我将“controltovalidate”设置为文本框,而不是自定义用户控件,客户端脚本工作正常!在我看来,我创建的复合用户控件存在问题。以前有人遇到过这个问题吗?是否有其他人看到自定义用户控件的客户端验证失败 一些额外信息: 复合控件是

我已经从System.Web.UI.UserControl创建了一个用户控件,并从System.Web.UI.WebControl.BaseValidator为用户控件创建了自己的验证程序。在我尝试让用户控件进行客户端验证之前,一切都正常

在尝试调试这个问题时,我将“controltovalidate”设置为文本框,而不是自定义用户控件,客户端脚本工作正常!在我看来,我创建的复合用户控件存在问题。以前有人遇到过这个问题吗?是否有其他人看到自定义用户控件的客户端验证失败

一些额外信息:

复合控件是一个下拉列表和“加载程序映像”,因为它是一个使用ICallbackEventHandler的支持ajax的下拉列表。我知道客户端javascript正在写入页面,并且在validator函数的第一行放置了一条“随机消息”,该消息仅在验证文本框时出现,即在验证自定义控件时不出现

语言:C ASP.NET 2.0和jQuery 1.2.6

在aspx文件中:

<rms:UserDDL ID="ddlUserTypes" runat="server" PreLoad="true" />
<rms:DDLValidator 
        ID="userTypesVal"
        ControlToValidate="ddlUserTypes"
        ErrorMessage="You have not selected a UserType"
        runat="server"
        Text="You have not selected a UserType"
        Display="Dynamic"
        EnableClientScript="true" />
在验证程序代码背后

protected string ScriptBlock
        {
            get
            {
                string nl = System.Environment.NewLine;
                return
                    "<script type=\"text/javascript\">" + nl +
                    "   function " + ScriptBlockFunctionName + "(ctrl)" + nl +
                    "   {" + nl +
                    "       alert('Random message'); " + nl +
                    "       var selVal = $('#' + ctrl.controltovalidate).val(); " + nl +

                    "       alert(selVal);" + nl +
                    "      if (selVal === '-1') return false;  " + nl +
                    "      return false;  " + nl +
                    "   }" + nl +
                    "</script>";
            }
        }

    protected override void OnPreRender(EventArgs e)
    {
        if (this.DetermineRenderUplevel() && this.EnableClientScript)
        {
            Page.ClientScript.RegisterExpandoAttribute(this.ClientID, "evaluationfunction", this.ScriptBlockFunctionName);
            Page.ClientScript.RegisterClientScriptBlock(GetType(), this.ScriptBlockKey, this.ScriptBlock);
        }

        base.OnPreRender(e);
    }
我知道我的控件属性有效,评估有效,工作正常

我非常感谢在这个问题上的任何帮助


Noel.

尝试使用CustomValidator而不是BaseValidator:

并设置ClientValidationFunction以确保调用JS:


我可能不得不求助于CustomValidator来让javascript工作,但这不像扩展BaseValidator那样可重用它应该是-自定义验证器扩展了基本验证器,因此您不应该在那里丢失任何功能。您是否担心某个特定领域?定制验证器v需要添加功能才能正常工作,因此如果我扩展了base[v],我只需编写一次功能,然后将其包含在需要的任何地方。自定义[v]需要放在用户控件中才能重复使用,这是一个额外的难题。啊-你可以扩展自定义验证器-这将使其可重复使用,封装你的逻辑,等等,同时还允许您利用现有功能通过脚本在客户端上触发验证器?我尝试了Chris关于使用自定义验证器的建议,它似乎与BaseValidator存在相同的问题。客户端验证函数从未被调用。我扩展了自定义验证器并给它一个ClientValidationFunction=,但仍然没有。还有什么建议吗?对那个问“你明白了吗?”的人说。。。简短的回答是:不,我不明白为什么它不起作用。相反,我创建了一个客户端对.NET2.0提供的服务器端解决方案的补充。由于只有特定的控件trype不起作用,我创建了一个带有“客户端启用程序”接口的验证程序,它等待按钮单击,然后单击,触发我创建的自定义验证程序提供的脚本。如果有任何失败,它将停止表单提交并显示错误。下面是我的验证器首先启动,然后一旦它们被纠正,剩下的部分。