【问题标题】:ASP.NET: aggregating validators in a user controlASP.NET:在用户控件中聚合验证器
【发布时间】:2010-03-16 16:45:50
【问题描述】:

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

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

所以,我有两个问题:

1) 是否可以让 UserControl 中的验证器控件验证父页面中的控件?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 在聚合验证器上公开属性以设置要验证的控件的名称是我正在做的......即使使用 ClientID 它仍然无法工作......
    • 在这种情况下,问题出在控件实例化上 - 当要验证的控件嵌套到用户控件时,验证器无法发现它们。不聚合的另一个原因...
    • 经过一番思考,我认为在用户控件中包含要验证的控件是最好的解决方案;即使可以做我正在尝试的事情,也不会得到回报。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 CompositeControl 的建议!无论如何,我认为我会选择最简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多