Domanda

Ho un controllo server che contiene controlli server nidificati,

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

Codice:

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

Definizione di controllo nidificato (si applica a tutti i controlli nidificati):

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

Definizione della classe di base

public abstract class ControlBase : Control
{
     protected Article article;

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

ArticleControl è responsabile della scrittura delle singole parti dell'articolo specificate dai controlli nidificati,

Il mio problema è che quando viene creato Articlecontrol, le istanze dei controlli del server nidificati vengono create dal framework .NET usando il costruttore predefinito definito per la classe System.Web.Ui.Control, ad esempio:

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

Devo chiamare o sovrascrivere il comportamento predefinito di .Net per chiamare il mio costruttore della classe base Control al posto del contrector definito .Net predefinito. Quindi, in breve, se viene creata una nuova istanza di HeadLineControl, deve essere creata dal constector ControlBase (articolo di articolo) .

È possibile e, se possibile, come posso farlo?

È stato utile?

Soluzione

L'ho fatto nel frattempo come soluzione alternativa, ma ci deve essere un modo migliore?

[PersistenceMode(PersistenceMode.InnerProperty)]
 public HeadLineControl HeadLine 
 {
      get { return null; }
      set 
      {
          this.Controls.Add(new HeadLineControl(articlePage.Article)();
      }
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top