ASP.NET:聚合用户控件中的验证器

时间:2010-03-16 16:45:50

标签: c# asp.net user-controls validation

我正在开发一个Web应用程序,我希望在某个字段上执行一组验证(特定情况下的帐户名称)。
我需要检查该值是否为空,是否匹配某个模式并且尚未使用 我尝试创建一个聚合RequiredFieldValidator,RegexValidator和CustomValidator的UserControl,然后我创建了一个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;
        }
    }
}

但是,如果我在页面上插入控件并将ControlToValidate设置为某个控件ID,那么当页面加载时我会收到一条错误消息,指出无法找到控件ID'AccountName'被'引用' ControlToValidate'属于'AccountNameRequiredFieldValidator'的属性,这让我觉得我的UserControl中的控件无法正确解析父页面中的控件。

所以,我有两个问题:

1)是否可以在UserControl中使用验证器控件来验证父页面中的控件?

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

2 个答案:

答案 0 :(得分:1)

首先解决您的第二个问题 - 除非您在用户控件中包含您正在验证的控件,否则我认为以这种方式“聚合”验证器并不是一个好主意。太多的工作没有足够的回报。

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

答案 1 :(得分:1)

我相信ASP.NET期望ControlToValidate ID位于同一个命名容器中。您可以覆盖验证方法并使用Parent.FindControl。

编辑:这可能是使用CompositeControl而不是UserControl的好地方。它们专为这种聚合而设计。但是你可能有类似的NamingContainer问题。