自定义验证程序和验证摘要

分享于 

8分钟阅读

Web开发

  繁體
Screenshot - CustomValidator_Validationsummary.jpg

介绍

本文演示如何构建自定义验证程序并根据不同条件自定义错误消息,以及添加验证摘要控件。 如果你有一个冗长的表单并且需要向下滚动以点击提交按钮来验证整个表单,这是非常有用的。 如果验证摘要未显示错误消息,则用户可能会被混淆。 默认情况下,自定义验证程序控件不会将错误消息呈现到验证摘要控件。

背景

我使用一个有各种自定义验证器的冗长表单,因为我们有一些根据用户选择的控件。 在设计表单之后,我发现在打开提交按钮时,必须滚动回来检查错误信息。 因此,我决定设计自己的自定义验证器来根据选择来显示错误消息。

使用代码

正如你在图片 上面 中所看到的,我创建了一个包含自定义验证程序 MyValidatorControl的示例项目。 这个页面的作用是:

  • 检查> 20,000.00复选框并输入无效值时,会显示错误消息"*> 20000"
  • 选中复选框并输入无效值时( 例如。 ,值或者非数值) 显示错误消息"*> 0 和 <20000""
  • 错误消息同时显示在自定义验证控件和验证摘要中

我创建了一个web自定义控件,并将它的命名为 MyValidatorControl。 我将它编译在程序集 MyValidatorControl.dll 中。 MyValidatorControl.dll的源代码在 MyValidatorControl.zip 下载。

在函数 EvaluateIsValid() 中,ControltoValidate 控件( 在这种情况下,一个文本框) 值基于复选框选择进行验证。 属性 Text() 还返回另一条消息。

PublicClass MyValidator
 Inherits CustomValidator
 Private sGT20 AsStringPrivate sLT20 AsStringPrivate bChked AsBoolean = FalseProperty Greaterthan20Text() AsStringGetReturn sGT20
 EndGetSet(ByVal value AsString)
 sGT20 = value
 EndSetEndPropertyProperty Lessthan20Text() AsStringGetReturn sLT20
 EndGetSet(ByVal value AsString)
 sLT20 = value
 EndSetEndPropertyProperty isGT20Checked() AsBooleanGetReturn ViewState("bChked")
 EndGetSet(ByVal value AsBoolean)
 ViewState("bChked") = value
 EndSetEndProperty <Bindable(True), Category("Appearance"), _
 DefaultValue(""), Localizable(True)>_
 OverridesProperty Text() AsStringGetIf isGT20Checked ThenReturn Greaterthan20Text
 ElseReturn Lessthan20Text
 EndIfEndGetSet(ByVal Value AsString)
 If isGT20Checked Then Greaterthan20Text = Value
 Else Lessthan20Text = Value
 EndIfEndSetEndPropertyProtectedOverridesFunction EvaluateIsValid() AsBooleanIfNot IsNumeric(Me.GetControlValidationValue(_
 Me.ControlToValidate)) ThenReturnFalseEndIfIf isGT20Checked AndCInt(_
 Me.GetControlValidationValue(_
 Me.ControlToValidate)) <20000ThenReturnFalseElseIfNot isGT20Checked AndCInt(_
 Me.GetControlValidationValue(Me.ControlToValidate)) <0ThenReturnFalseEndIfReturnTrueEndFunctionEndClass

根据你的需求修改这个,并将它的编译成程序集( DLL文件)。 创建一个名为"Project1"--的网站,或者你可以将它的命名为 --,并将已经编译的程序集添加到 Project1 bin文件夹。 可以在bin文件夹中复制和放置 DLL,也可以通过 Visual Studio 中的"添加引用"功能进行复制。

在设计模式下打开 Default.aspx,并放置一个文本框。RequiredFieldValidator。一个复选框。ValidationSummary 控件和自定义验证程序 MyValidator。 控件的属性 Greaterthan20TextLessthan20Text 是预设的。

<% @ Register Assembly="MyValidatorControl" 
 Namespace="MyValidatorControl" TagPrefix="cc1"%><body><formid="form1"runat="server"><div><asp:TextBoxID="TextBox1"runat="server"></asp:TextBox><asp:RequiredFieldValidatorID="rfvalidator"runat="server"ErrorMessage="* Required"ControlToValidate="TextBox1"></asp:RequiredFieldValidator><cc1:MyValidatorid="MyValidator1"runat="server"ControlToValidate="TextBox1"ErrorMessage="*> 0"Greaterthan20Text="*> 20000 required"Lessthan20Text="*> 0 required and <20000"ClientValidationFunction="ValidateGT20Function"ValidateEmptyText="True"> *> 0 required and <20000</cc1:MyValidator><br/><asp:CheckBoxID="CheckBox1"runat="server"AutoPostBack="True"Text="> 20,000.00"Width="98px"/><br/><br/><asp:ValidationSummaryID="ValidationSummary1"runat="server"ShowMessageBox="True"DisplayMode="List"ShowSummary="false"/><asp:ButtonID="Button1"runat="server"Text="Submit"/></div></form></body>

复选框控件属性 AutoPostBack 应设置为 true。 事件 CheckedChanged 在 Default.aspx.vb 中处理。

Protected Sub CheckBox1_CheckedChanged(ByVal sender As Object, _
 ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
 MyValidator1.isGT20Checked = CheckBox1.CheckedEndSub

MyValidator 控件有一个名为 ClientValidationfunction的属性,它被设置为 ValidateGT20Function。 这将是客户端JavaScript函数来检查textbox中的值并验证。

<scriptlanguage="javascript"type="text/javascript">function ValidateGT20Function(source, arguments)
{
 var val = 
 document.getElementById(document.getElementById(
 source.id).getAttribute("controltovalidate")).value;
 if (isNaN(val)) 
 {
 document.getElementById(source.id).setAttribute("errormessage",
"* number required");
 arguments.IsValid = false;
 }
 else
 {
 if (document.getElementById("CheckBox1").getAttribute(
"Checked") == true) 
 {
 if (val <20000){document.getElementById(source.id).setAttribute("errormessage","*>20000 required");
 arguments.IsValid = false;
 }
 else
 {
 arguments.IsValid = true;
 }
 }
 else
 {
 if (val <0){document.getElementById(source.id).setAttribute("errormessage","*>0 and <20000required");arguments.IsValid= false;}else{arguments.IsValid= true;}}}}</script>

Points of Interest

也许还有其他解决方法但是我找不到。 请将链接发送给我任何其他可能的解决方案。 快乐编程别忘了有乐趣。

历史记录

  • 10 2007年10月 --原始版本已经发布

相关文章