Pregunta

Tengo un control de servidor que contiene controles de servidor anidados,

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

Código:

[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;
    }
}

Definición de control anidado (se aplica a todos los controles anidados):

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

Definición de clase base

public abstract class ControlBase : Control
{
     protected Article article;

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

El ArticleControl es responsable de escribir las partes individuales del artículo especificado por los controles anidados,

Mi problema es que cuando se crea Articlecontrol, las instancias de los controles de servidor anidados se crean mediante .NET framework utilizando el constructor predeterminado definido para la clase System.Web.Ui.Control, por ejemplo:

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();

Necesito llamar o anular el comportamiento predeterminado de .Net para llamar a mi constructor de clase base Control en lugar del constructor predeterminado .Net definido. En resumen, si se crea una nueva instancia de HeadLineControl, debe ser creada por el constructor ControlBase (Artículo del artículo) .

¿Es esto posible y, si es posible, cómo lo logro?

¿Fue útil?

Solución

Mientras tanto, he hecho esto como una solución, pero ¿debe haber una mejor manera?

[PersistenceMode(PersistenceMode.InnerProperty)]
 public HeadLineControl HeadLine 
 {
      get { return null; }
      set 
      {
          this.Controls.Add(new HeadLineControl(articlePage.Article)();
      }
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top