Вложенные элементы управления сервером - PullRequest
0 голосов
/ 27 октября 2009

У меня есть серверный элемент управления, который содержит вложенные серверные элементы управления,

<uc1:ArticleControl runat="server">
     <HeadLine></HeadLine>
     <Blurb></Blurb>
     <Body></Body>
</uc1:ArticleControl>

Код:

[ToolboxData("<{0}:ArticleControl runat=server></{0}:ArticleControl>")]
[ParseChildren(ChildrenAsProperties = true)]
public class ArticleControl : WebControl
{

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public HeadLineControl HeadLine 
    {
        get;
        set;
    }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public BlurbControl Blurb
    {
        get;
        set;
    }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public BodyControl Body
    {
        get;
        set;
    }
}

Определение вложенного элемента управления (применяется ко всем вложенным элементам управления):

 public class HeadLineControl : ControlBase
     {
          public HeadLineControl() : base() { }
          public HeadLineControl(Article article) : base(article) { }

Определение базового класса

public abstract class ControlBase : Control
{
     protected Article article;

     protected ControlBase() { }
     protected ControlBase(Article article)
     {
          this.article = article;
     }

ArticleControl отвечает за написание отдельных частей статьи, указанных вложенными элементами управления,

Моя проблема в том, что при создании Articlecontrol экземпляры вложенных серверных элементов управления создаются .NET Framework с использованием конструктора по умолчанию, определенного для класса System.Web.Ui.Control, например:

namespace System.Web.UI
{

public class Control : IComponent, IDisposable, IParserAccessor, IUrlResolutionService, IDataBindingsAccessor, IControlBuilderAccessor, IControlDesignerAccessor, IExpressionsAccessor
    {
        // Summary:
        //     Initializes a new instance of the System.Web.UI.Control class.
        public Control();

Мне нужно вызвать или переопределить стандартное поведение .Net, чтобы вызвать мой конструктор базового класса Control вместо стандартного .Net определенного конструктора. Короче говоря, если создается новый экземпляр HeadLineControl, он должен быть создан конструктором ControlBase(Article article).

Возможно ли это и, если возможно, как мне это сделать?

1 Ответ

0 голосов
/ 27 октября 2009

Тем временем я сделал это как обходной путь, но должен быть лучший способ?

[PersistenceMode(PersistenceMode.InnerProperty)]
 public HeadLineControl HeadLine 
 {
      get { return null; }
      set 
      {
          this.Controls.Add(new HeadLineControl(articlePage.Article)();
      }
 }
...