C# ASP.NET自定义验证程序客户端&;服务器端验证未启动

C# ASP.NET自定义验证程序客户端&;服务器端验证未启动,c#,.net,asp.net,validation,customvalidator,C#,.net,Asp.net,Validation,Customvalidator,我以前从未遇到过这种情况,但由于某些原因,客户端和服务器端验证事件都没有被触发: <asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" /> <asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true" ErrorMessage="Delivery Town or City

我以前从未遇到过这种情况,但由于某些原因,客户端和服务器端验证事件都没有被触发:

<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" />
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true"
    ErrorMessage="Delivery Town or City required"
    ClientValidationFunction="TextBoxDTownCityClient" 
    ControlToValidate="TextBoxDTownCity"
    OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" >
</asp:CustomValidator>
客户端验证事件:

protected void TextBoxDTownCity_Validate(object source, ServerValidateEventArgs args)
{
    args.IsValid = false;
}
function TextBoxDCountyClient(sender, args) {
    args.IsValid = false;
    alert("test");
}
我想至少服务器端验证会启动,但不会。这在我以前从未发生过。这真的把我难住了

我查看了输出,ASP.NET正在识别客户端功能:

ASP.NET JavaScript输出:

var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2");

ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity";

ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required";

ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic";

ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid";

ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient";
呈现自定义验证程序:

<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span> 
需要送货城镇或城市
有人能解释一下为什么客户端和服务器端验证都不会启动吗

编辑:我粘贴了错误的函数,问题仍然存在

只是对最后一条评论的另一个更新:文本框的where不能为空。我对此进行了测试,结果并非如此。在空白页上,CustomValidator启动了我的客户端验证函数,但没有值:

<asp:TextBox ID="TextBox1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server" 
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

您是否验证导致回发的控件是否已将CausesValidation设置为tru,并且没有为其分配验证组


我不确定还有什么可能导致这种行为。

如果客户端验证无效,服务器端验证将不会启动,回发不会发送

难道你没有其他无法通过的验证吗

客户端验证未执行,因为您指定了
ClientValidationFunction=“TextBoxDTownCityClient”
,这将查找名为
TextBoxDTownCityClient
的函数作为验证函数,但函数名应为
TextBoxDAddress1Client


(如您所写)

只有当
文本框不为空时,您的
CustomValidator
才会启动

如果您需要确保它不是空的,那么您也需要一个

编辑:

如果您的
CustomValidator
指定了
ControlToValidate
属性(您的原始示例也指定了该属性),则只有当控件不为空时才会调用验证函数

如果未指定
ControlToValidate
,则每次都会调用验证函数

这为问题提供了第二种可能的解决方案。您可以从
CustomValidator
中省略
ControlToValidate
属性,而不是使用单独的
RequiredFieldValidator
,并将验证功能设置为执行以下操作:

客户端代码(Javascript):


客户端验证根本没有在我的web表单上执行,我也不知道为什么。问题是javascript函数的名称与服务器控件ID相同

所以你不能这么做

<script>
  function vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" />

函数vld(发送方,args){args.IsValid=true;}
但这是可行的:

<script>
  function validate_vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" />

函数validate_vld(发送方,args){args.IsValid=true;}

我猜它与内部.NET Javascript冲突?

还要检查您是否未使用验证组,因为如果设置了validationgroup属性且未通过

 Page.Validate({Insert validation group name here});
使用以下命令:

<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>

验证空字段


您不需要添加2个验证器

感谢您提供有关控制验证LukeH的信息

我在代码中试图做的是,当文本字段B有一个特定值时,只确保某个文本字段A中有一些文本。否则,A可以为空或其他任何形式。在我的加价中去掉ControlToValidate=“A”为我解决了这个问题


干杯

我使用ImageButton进行提交,但我没有说明任何验证组。对我来说太快了,我键入了相同的答案:)+1“你的CustomValidator只有在文本框不为空时才会启动”我在一个干净的页面上测试了这一点,结果不是真的。即使文本框为空,客户端验证函数也会激发。我知道我需要做什么。如果我省略了ControlToValidate属性,那么我就成功地完成了我想要做的事情,客户端函数会在我需要时启动。这是一个很酷的解决方案,对我来说很有效。但是,我使用Ajax控件工具包中的ValidatorCalloutExtender,它需要设置ControlToValidate属性。总是有点…:-(您也可以使用CustomValidator.ValidateEmptyText属性?我正在搜索的解决方案。谢谢。是的,但您仍然需要文本框中的文本才能使验证器正常工作!
 Page.Validate({Insert validation group name here});
<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>