【问题标题】:Pass a Control to a Method将控件传递给方法
【发布时间】:2011-09-23 14:37:51
【问题描述】:

我正在尝试创建一个自定义验证传递给它的任何 TextBox 控件的方法。

这是我目前所得到的:

自定义验证器

protected void CustomValidatorDelLN_ServerValidate(object sender, ServerValidateEventArgs args)
    {
        CustomValidator ThisValidator = sender as CustomValidator;
        TextBox MyBox = FindControl(ThisValidator.ControlToValidate) as TextBox;

        args.IsValid = isValid(MyBox);
    }

验证方法

protected bool isValid(System.Web.UI.WebControls.TextBox MyBox)
    {
        bool is_valid = MyBox.Text != "";
        MyBox.BackColor = is_valid ? System.Drawing.Color.White : System.Drawing.Color.LightPink;
        return is_valid;
    }

代码编译正常,但我得到了一个

NullReferenceException 未被用户代码处理

bool is_valid = MyBox.Text != "";

当我运行验证时。

我知道我很接近(我想我很接近)但我哪里出错了?

【问题讨论】:

  • Line 'TextBox MyBox = FindControl(ThisValidator.ControlToValidate) as TextBox;' - MyBox 为空
  • 看看 FinControl() 它不是递归的。我不确定你为什么在那里使用 FindControl(),你在页面上吗?如果是这样,您可以将 runat="server" 放在该sucka 中并按名称使用它。
  • 抱歉,我看到你在自定义验证器中使用它,所以你可以验证任何文本框。
  • @EJC FindControl() 被建议作为解决方案
  • @EJC 感谢您的 cmets 帮助减少了一分钱。所有人都在工作。

标签: c# asp.net validation methods


【解决方案1】:

您的问题是FindControl() 方法不是递归的,因此MyBox 为空。如果你想让它正常工作,你必须编写一个递归的FindControl() 方法,比如here

您可能还想检查MyBox 是否为空,如果是则从方法中返回。

【讨论】:

    【解决方案2】:

    您首先需要在转换后检查对象本身是否存在:

    bool is_valid = MyBox != null;
    

    然后你可以检查它的文本属性

    【讨论】:

      【解决方案3】:

      为了完整起见,这段代码对我有用:

      protected void CustomValidatorDelLN_ServerValidate(object sender, ServerValidateEventArgs args)
          {
              args.IsValid = isValid(txtDeliveryLastName);
          }
      
          protected bool isValid(System.Web.UI.WebControls.TextBox MyBox)
          {
              bool is_valid = MyBox.Text != "";
              MyBox.BackColor = is_valid ? System.Drawing.Color.White : System.Drawing.Color.LightPink;
              return is_valid;
          }
      

      【讨论】:

        【解决方案4】:

        您正在尝试验证一个空文本框。您无法验证空字符串。

        【讨论】:

        • 空字符串不会导致NullReferenceException
        • bool is_valid = MyBox.Text != "";这不会导致 NullReferenceException 吗?为什么不像上面的海报那样做 bool is_valid = MyBox.Text != "null"
        • 问题不在于空字符串。它正在访问一个空对象的.Text 属性。换个角度看。空字符串是空引用吗? (否。)或者文本框变量是否包含空引用? (是的。)然后询问您是否可以访问空引用的属性。
        • 我想我说错了...我的意思是空对象,而不是空字符串。是的,字符串可以为空且不为空。谢谢指正。