【问题标题】:Passing a web control reference to a User Control base class将 Web 控件引用传递给用户控件基类
【发布时间】:2011-12-21 04:14:44
【问题描述】:

我创建了几个用户控件——大多数都包含一个 Web 控件(文本框、下拉菜单、单选按钮等)——以及一个或多个验证控件。重点是将控制和验证组合在一个用户控件中。

我为这些具有一些通用功能的用户控件创建了一个基类 - 单个 Web 控件的多个属性的设置器,特别是要在 ascx 的控件中设置的 CssClass 和 Style。
例如,带有单个必填字段验证器的单个文本框。

基类的示例代码:

public WebControl ctrl {get; set;}  //allow derived class access to this

public string CssClass
{
  set { ctrl.CssClass = value; }    //allow CssClass to be set in the aspx page
}

派生类的示例代码: (在构造函数或控件 OnInit 事件中 - 或?)

base.ctrl = txt;    //tell the base class which web control to apply common properties to.

public string ErrorMessage
{
    set { val.ErrorMessage = value;}    //this works !
}

ascx 的示例代码:

<asp:TextBox ID="txt" Cssclass="input-text-m" maxlength="50" runat="server" />
<asp:RequiredFieldValidator ID="val" runat="server" ControlToValidate="txt" 
    ErrorMessage="">*</asp:RequiredFieldValidator>

aspx 示例代码:

<uc:TextBox ID="ForeName" Cssclass="input-text-m" maxlength="50" 
ErrorMessage="Forename" runat="server"/>

我发现的问题是,在调用基类属性设置器之前,我找不到派生类设置基类 Web 控件引用的方法。 如果我在派生类构造函数中设置 base.ctrl - 那么派生类控件引用(txt)此时仍然为空。 如果我在任何控制事件中设置 base.ctrl - 例如 OnInit - 那么这为时已晚。

到目前为止,我通过简单地不使用基类,而是在用户控件类中编写属性设置器代码来解决这个问题,但这意味着代码重复,这是我试图避免的。

有没有办法通知控件的基类,我希望它在设置属性之前设置它们的属性 - 或者我是否以错误的方式处理事情......

【问题讨论】:

    标签: asp.net webusercontrol abstract-base-class


    【解决方案1】:

    在任何 get/set 操作之前调用 EnsureChildControls 并在 EnsureChildControls 中包括 ctrl = txt 的 set 操作怎么样?这对于普通的服务器控件来说是相当标准的做法,我认为它也适用于 UserControls。

    public string CssClass {   set { EnsureChildControls(); ctrl.CssClass = value; } } 
    

    覆盖EnsureChildControls,保留对base 的调用,并在调用base 之后在此处设置ctrl = txt;

    更多信息:http://msdn.microsoft.com/en-us/library/system.web.ui.control.ensurechildcontrols.aspx

    【讨论】:

    • 好吧,您的想法可行,尽管在这种情况下似乎不需要 EnsureChildControls()。重要的一点是覆盖的想法,它允许基类属性设置器在需要时直接访问派生类控件——此时,控件引用 (txt) 不再为空。我在基类中为控件创建了一个虚拟属性,并在派生类中覆盖了它,如下所示:code public virtual WebControl ctrl { get;放; } 公共覆盖 WebControl ctrl { 获取 { 返回 txt; } } code 这是一种享受!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多