65.9K
CodeProject 正在变化。 阅读更多。
Home

通用的必填字段验证器的自定义控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.35/5 (11投票s)

2004年10月4日

2分钟阅读

viewsIcon

54603

downloadIcon

242

用于页面上多个必填字段的通用验证控件。 验证必填字段的简单而优雅的方法。

Sample Image - GroupValidatorSummary.gif

引言

最初,我对 ASP.NET 验证控件印象深刻。 但是,当我开始使用这些控件时,我恼怒的是我们不能对多个控件使用相同的验证控件。 因此,如果您有更多“必填字段”,您最终会得到更多数量的 RequiredFieldValidator。 第二个问题是我们无法模仿旧式的 JavaScript 验证,它会提醒用户特定字段并设置焦点。 因此,我决定创建一个可以同时满足这两个目的的自定义验证控件。

使用代码

此控件非常易于使用,与普通的 RequiredFieldValidator 控件非常相似。

如果您只有一个必填字段,此控件的行为将类似于 RequiredFieldValidator 控件。

如果您有一组要验证的控件,请在 Page_Load 上使用 AddControlToValidate (TextBox, ErrorMessageToBeDisplay)。 您也可以设置警报类型。 默认情况下,它会向用户弹出警报消息并将焦点设置到必填字段。

private void Page_Load(object sender, System.EventArgs e)
{
    GroupReqValidator1.AddControlToValidate(TextBox1, "Please Enter Date ");
    GroupReqValidator1.AddControlToValidate(TextBox2, "Please Enter Name");
    GroupReqValidator1.AddControlToValidate(TextBox3, "Please Enter Surname");
}

关注点

那么,让我们开始解开这个控件背后的魔力吧。 这很简单。 因为我想构建一个组 RequiredFieldValidator 控件,所以我从 System.Web.UI.WebControls.RequiredFieldValidator 继承我的类,以便我们获得所有基本函数实现。

首先,我们需要某种集合来存储要验证的控件的引用以及要显示的相应消息。 因此,我使用了 ArrayList,以及一个变量来存储显示样式。

/// <SUMMARY>
/// ArrayList to Hold objects to be Validated
/// </SUMMARY>
private System.Collections.ArrayList objList= 
                    new System.Collections.ArrayList();

/// <SUMMARY>
/// ArrayList to Hold Message when Object is not Valid
/// </SUMMARY>
private System.Collections.ArrayList arrErrorMessage= 
                    new System.Collections.ArrayList();

/// <SUMMARY>
/// Style to be used to display the error message
/// </SUMMARY>
private int iAlertType=0;

接下来,创建一个函数以将控件和消息添加到此 ArrayList

/// <SUMMARY>
/// Add TextBox control and Display message to private ArrayList
/// </SUMMARY>
public void AddControlToValidate(TextBox objCtl,string strErrorMessage)
{
    objList.Add(objCtl); 
    arrErrorMessage.Add(strErrorMessage);
}

接下来,我们需要生成客户端脚本来验证所有控件并在需要时显示警报。 我在 OnPreRender 函数中完成了这项工作。

System.Text.StringBuilder strJavaScript=new System.Text.StringBuilder();

//Generate the Validation Event to Validate control
strJavaScript.Append(@"<script JavaScript?? langauge="">"); 
strJavaScript.Append(@"function ValidateGroupControl(){var msg='<ui>';");
for(int i=0;i<objList.Count;i++)
{
  strJavaScript.Append(@"if( document.all['"+ 
                           ((TextBox)objList[i]).ID+"'].value==''){");
  //Add Alert is Type is set to Alert else 
  //build the error message string to be displayed
  if(iAlertType==0)
  {
    strJavaScript.Append(@"alert('"+ (string)arrErrorMessage[i] + 
                          "');document.all['"+((TextBox)objList[i]).ID+ 
                          "'].focus();return false;}");
  }
  else
  {
    strJavaScript.Append(@"msg=msg+'<li>"+
                         (string)arrErrorMessage[i]+"</li>';}"); 
  }
}

if(iAlertType==1)
{
  strJavaScript.Append(@"if(msg!=''){document.all['"+ 
            this.ID+"'].innerHTML=msg+'</ui>';return false;}");
}

strJavaScript.Append(@"return true;}</script>");
Page.RegisterClientScriptBlock("funValidate",strJavaScript.ToString());

注册脚本后,我们需要在提交表单时调用此脚本。 我们可以使用 RegisterOnSubmitStatement 函数来注册。

protected override void OnInit(EventArgs e)
{
  base.OnInit (e);
  Page.RegisterOnSubmitStatement("GroupValidation", 
                  "return ValidateGroupControl();");
}

到目前为止一切顺利。 现在,客户端验证已完成。 但是如果 JavaScript 被禁用怎么办? 因此,我们也必须实现服务器端验证。 我们可以通过实现 EvaluateIsValid 来做到这一点。

protected override bool EvaluateIsValid()
{
  if(objList.Count==0)
  {
    // Get the control value; return true if it is not found.
    string controlValue = GetControlValidationValue(ControlToValidate);
    if (controlValue == null) 
    {
      //Debug.Fail("Should have been caught by PropertiesValid check.");
      return true;
    }
    // See if the control has changed.
    return !controlValue.Trim().Equals(InitialValue.Trim()) ;
  }
  else
  {
    bool result=true;
    string strmsg="";
    for(int i=0;i < objList.Count;i++)
    {
      if(((TextBox)objList[i]).Text.Trim().Equals(InitialValue.Trim()))
      {
        strmsg+="\n"+(string)arrErrorMessage[i];
        result=false;
      }
    }
    this.ErrorMessage = strmsg;

    return result;
  }
}

给你.. 构建此控件库,添加对您的项目的引用,并享受验证。 请给我留下评论..

历史

  • 创建于 2004 年 10 月 4 日。
© . All rights reserved.