ASP.NET Custom Validator客户端&服务器端验证未触发

时间:2009-03-31 13:44:09

标签: 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 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> 

任何人都可以了解为什么客户端和服务器端验证都不会被解雇。

编辑:Typo我粘贴错误的功能,问题仍然相同

对最后一条评论的另一次更新: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" />

7 个答案:

答案 0 :(得分:122)

使用此:

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

验证空字段。

您无需添加2个验证器!

答案 1 :(得分:109)

CustomValidator仅在TextBox不为空时才会触发。

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

  

Note: If the input control is empty, no validation functions are called and validation succeeds. Use a RequiredFieldValidator control to require the user to enter data in the input control.

修改

如果您的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 :(得分:4)

我的网络表单上根本没有执行客户端验证,我不明白为什么。事实证明问题是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 :(得分:3)

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

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

答案 4 :(得分:2)

同时检查您是否使用验证组,因为如果验证组属性已设置且未通过

明确调用验证组属性,则验证不会触发
 Page.Validate({Insert validation group name here});

答案 5 :(得分:0)

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

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

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

(正如你所写)

答案 6 :(得分:0)

感谢ControlToValidate LukeH上的信息!

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

干杯!