我正在开发一个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中“聚合”多个验证器控件是否正确和良好做法?如果没有,进行的标准方法是什么?
答案 0 :(得分:1)
首先解决您的第二个问题 - 除非您在用户控件中包含您正在验证的控件,否则我认为以这种方式“聚合”验证器并不是一个好主意。太多的工作没有足够的回报。
您可以通过在AggregatedValidator上公开属性来设置要验证的控件的名称来修复此问题,并传入要验证的控件的ClientID。
答案 1 :(得分:1)
我相信ASP.NET期望ControlToValidate ID位于同一个命名容器中。您可以覆盖验证方法并使用Parent.FindControl。
编辑:这可能是使用CompositeControl而不是UserControl的好地方。它们专为这种聚合而设计。但是你可能有类似的NamingContainer问题。