代码之家  ›  专栏  ›  技术社区  ›  Paolo Tedesco

ASP.NET:在用户控件中聚合验证程序

  •  0
  • Paolo Tedesco  · 技术社区  · 15 年前

    我正在开发一个Web应用程序,我想在其中对某个字段(特定情况下的帐户名)执行一组验证。
    我需要检查该值是否不为空,是否与某个特定模式匹配,以及是否已被使用。
    我试图创建一个用户控件,它聚合了一个RequiredFieldValidator、一个RegexValidator和一个CustomValidator,然后我创建了一个 ControlToValidate 属性如下:

    public partial class AccountNameValidator : System.Web.UI.UserControl {
        public string ControlToValidate {
            get { return ViewState["ControlToValidate"] as string; }
            set { 
                ViewState["ControlToValidate"] = value;
                AccountNameRequiredFieldValidator.ControlToValidate = value;
                AccountNameRegexValidator.ControlToValidate = value;
                AccountNameUniqueValidator.ControlToValidate = value;
            }
        }
    }
    

    但是,如果我在页面上插入控件并设置 件实 对于某个控件ID,当页面加载时,我得到一个错误,该错误表示 找不到“accountnameRequiredFieldValidator”的“controlToValidate”属性所引用的控件ID“accountname” ,这使我认为用户控件中的控件无法正确解析父页中的控件。

    所以,我有两个问题:

    1)是否可以在UserControl内使用验证程序控件验证父页中的控件?

    2)在一个用户控件中“聚合”多个验证器控件是正确和良好的做法吗?如果没有,标准的方法是什么?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Dave Swersky    15 年前

    首先解决您的第二个问题-我认为这样“聚合”验证器不是一个好主意,除非您将要验证的控件包含在用户控件中。工作太多,报酬不够。

    您可以通过公开AggregatedValidator上的属性来解决此问题,以设置要验证的控件的名称,并传入要验证的控件的clientID。

        2
  •  1
  •   Bryan    15 年前

    我相信ASP.NET期望ControlToValidate ID位于同一命名容器中。您可能可以重写验证方法并使用parent.findcontrol。

    编辑:这可能是使用复合控件而不是用户控件的好地方。它们只是为这种聚合而设计的。但你可能也有类似的纳米集装箱问题。