对ASP.NET自定义验证器进行排序以及Validator的Text和ErrorMessage属性之间的区别

时间:2013-08-26 13:53:32

标签: c# asp.net .net validation customvalidator

我有一个带有两个验证器的TextBox。第一个验证器检查TextBox是否为空。第二个验证器检查TextBox的值是否包含空格。但是,当我运行项目并尝试在TextBox中没有任何文本进行验证时,它会显示两个验证程序的错误消息。我想要的是,在成功验证第一个验证器之前,它不应该执行第二个验证器。

<asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="TextBox3" ErrorMessage="Please enter some value." Font-Names="Segoe UI" OnServerValidate="CustomValidator1_ServerValidate" SetFocusOnError="True"></asp:CustomValidator>
<br />
<asp:CustomValidator ID="CustomValidator2" runat="server" ControlToValidate="TextBox3" ErrorMessage="Spaces are not allowed." Font-Names="Segoe UI" OnServerValidate="CustomValidator2_ServerValidate" SetFocusOnError="True"></asp:CustomValidator>
<br />

所以我的问题是:

如何对验证进行排序,以便在成功验证其他验证后调用一个验证?

我想问的另一个问题是Validator的Text和ErrorMessage属性有什么区别?

3 个答案:

答案 0 :(得分:2)

您应该使用RequiredFieldValidator表示空文本,然后使用CustomValidator查看字符串组成。

<asp:RequiredFieldValidator 
 ID="RequiredFieldValidator1"
 ControlToValidate="TextBox3"  
 runat="server"     
 ErrorMessage="Please enter some value.">
</asp:RequiredFieldValidator>
<br />
<asp:CustomValidator 
 ID="CustomValidator2" 
 runat="server" 
 ControlToValidate="TextBox3" 
 ErrorMessage="Spaces are not allowed." 
 Font-Names="Segoe UI" 
 OnServerValidate="CustomValidator2_ServerValidate" SetFocusOnError="True">
</asp:CustomValidator>
<br />

来自MSDN的ErrorMessage

  

获取或设置a中显示的错误消息的文本   验证失败时的ValidationSummary控件。

来自MSDN的Text

  

获取或设置验证控件中显示的文本   验证失败。 (重写Label.Text。)

编辑:

鉴于您正在进行多项验证,您应该使用单CustomValidator。在服务器端,你应该同时检查Empty和Then组合,如下所示:

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
  if (string.IsNullOrEmpty(args.Value))
  {
    args.IsValid = false;
    ((CustomValidator)source).Text = "Please enter some value.";
  }
  else if (/*Check if has empty space*/)
  {
    args.IsValid = false;
    ((CustomValidator)source).Text = "Spaces are not allowed.";
  }
  else
  {
    args.IsValid = true;
  }
}

答案 1 :(得分:2)

回答问题:How can I sequence the validations so that one validation should be called after other is validated successfully ?

您在.aspx页面中添加的验证程序,它们将按照创建它们的顺序添加到Page.Validators集合中。验证按照它们出现在Page.Validators集合中的顺序运行。因此,aspx文件中的第一个验证器首先在Page.Validators中。如果您想重新排列订单,那么正确的方法是按照您希望它们触发的顺序在页面中排列验证器。

注意:验证器将逐个触发。如果您不希望下一个验证器触发,您可以使用Javascript来禁用下一个验证器。在第一个验证器中调用ClientValidation函数

<asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="TextBox3"
     ClientValidationFunction="disableNextVal" ....

//示例JavaScript代码

function disableNextVal()
{
 // firstly check here for first condition, if First condition fails,
 // disable the next validator as below.
  var nextCustomVal = document.getElementById('nextCustomValidatorClientID');
  ValidatorEnable(myVal, false); 
// or use this one:
  myVal.enabled = false;
}

//同样看到你的要求,似乎还有一种可能性就是MaskValidator。 Check here

2nd question:

Text&amp;之间的差异ErrorMessage财产:

Text:验证失败时显示的消息。这通常出现在您的控件旁边,如TextBox。这与ValidationSummary控件无关。

ErrorMessage:验证失败时ValidationSummary控件中显示的文本。如果您未在上面设置Text属性,则此ErrorMessage值将显示在验证控件中。

答案 2 :(得分:1)

虽然稍有不同,但ValidationSummary可能对您有所帮助。