ASP.NET自定义验证器客户端和服务器端验证未触发


72

我以前从未发生过这种情况,但是由于某种原因,客户端和服务器端验证事件均未触发:

<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> 

任何人都可以阐明为什么客户端和服务器端验证都不会触发的原因。

编辑:错别字我粘贴了错误的功能,问题依旧

对最后一条注释的另一个更新:TextBox的位置不能为空。我对此进行了测试,但事实并非如此。在空白页上,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" />

Answers:


114

CustomValidator只会在TextBox不为空时触发。

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

注意:如果输入控件为空,则不会调用任何验证函数,并且验证成功。使用RequiredFieldValidator控件要求用户在输入控件中输入数据。

编辑:

如果CustomValidator指定了ControlToValidate属性(原始示例中指定了属性),则仅当控件不为空时才调用验证函数。

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

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

客户端代码(JavaScript):

function TextBoxDCountyClient(sender, args) {
    var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value;
    if (v == '') {
        args.IsValid = false;  // field is empty
    }
    else {
        // do your other validation tests here...
    }
}

服务器端代码(C#):

protected void TextBoxDTownCity_Validate(
    object source, ServerValidateEventArgs args)
{
    string v = TextBoxDTownCity.Text;
    if (v == string.Empty)
    {
        args.IsValid = false;  // field is empty
    }
    else
    {
        // do your other validation tests here...
    }
}

2
对我来说太快了,我输入了相同的答案:) +1
David Waters

2
“您的CustomValidator仅在TextBox不为空时才会触发”,我在干净的页面上对此进行了测试,但事实并非如此。即使文本框为空,客户端验证功能也会触发
REA_ANDREW,2009年

我的错。我知道我需要做什么。如果我省略ControlToValidate属性,那么我会成功完成我想做的事情,并且在需要时会触发客户端函数。
REA_ANDREW,2009年

这是一个很不错的解决方案,为我工作。但是,我使用来自Ajax控件工具包的ValidatorCalloutExtender,它需要设置ControlToValidate属性。总是这样... :
Mike Cole

3
您还可以使用CustomValidator.ValidateEmptyText属性吗?msdn.microsoft.com/en-us/library/...
IrishChieftain,

129

用这个:

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

验证一个空字段。

您无需添加2个验证器!


1
我正在寻找的解决方案。谢谢。
Mehmood

5

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

所以你做不到...

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

但这有效:

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

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


3

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

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


我对提交使用了一个ImageButton,但尚未说明任何验证组。
REA_ANDREW,2009年

3

还要检查您是否未使用验证组,因为如果设置了validategroup属性并且未通过显式调用,则验证不会触发

 Page.Validate({Insert validation group name here});

是的,但是您仍然需要文本框中的文本才能使验证器正常工作!
Fandango68年

0

如果客户端验证无效,则不会发送回发,因此不会触发服务器端验证。

您是否还有其他无法通过的验证?

客户端验证未执行,因为您已指定ClientValidationFunction="TextBoxDTownCityClient",这将查找名为TextBoxDTownCityClient验证功能的函数,但该函数名称应为 TextBoxDAddress1Client

(如您所写)


0

感谢您提供有关ControlToValidate LukeH的信息!

我在代码中尝试做的是,仅当文本字段B具有特定值时,才确保某些文本字段A在该字段中具有某些文本。否则,A可以为空白或其他任何内容。在我的标记中摆脱ControlToValidate =“ A”可以为我解决此问题。

干杯!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.