74

这在我之前没有发生过,但由于某种原因,客户端和服务器端验证事件都没有被触发:

<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" />
4

7 回答 7

133

用这个:

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

验证一个空字段。

您不需要添加 2 个验证器!

于 2010-08-25T11:05:06.510 回答
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...
    }
}
于 2009-03-31T14:02:38.257 回答
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 冲突?

于 2009-04-15T21:56:09.707 回答
3

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

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

于 2009-03-31T13:49:41.280 回答
3

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

 Page.Validate({Insert validation group name here});
于 2009-05-18T12:54:47.217 回答
0

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

您没有其他未通过的验证吗?

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

(正如你所写)

于 2009-03-31T13:50:57.847 回答
0

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

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

干杯!

于 2012-01-19T17:03:49.103 回答