Question

J'ai un contrôle serveur contenant des contrôles serveur imbriqués,

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

Code:

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

Définition du contrôle imbriqué (s'applique à tous les contrôles imbriqués):

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

Définition de la classe de base

public abstract class ControlBase : Control
{
     protected Article article;

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

ArticleControl est responsable de l'écriture pour les différentes parties de l'article spécifiées par les contrôles imbriqués,

Mon problème est que, lorsque Articlecontrol est créé, des instances des contrôles serveur imbriqués sont créées par le framework .NET à l'aide du constructeur par défaut défini pour la classe System.Web.Ui.Control, par exemple:

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

Je dois appeler ou remplacer le comportement par défaut de .Net pour appeler mon constructeur de la classe de base Control au lieu du constructeur par défaut défini par Net. En bref, si une nouvelle instance de HeadLineControl est créée, elle doit être créée par le ControlBase (article d'article) .

Est-ce possible et, si possible, comment puis-je y parvenir?

Était-ce utile?

La solution

Je l'ai fait entre-temps en guise de solution de contournement, mais il doit y avoir un meilleur moyen?

[PersistenceMode(PersistenceMode.InnerProperty)]
 public HeadLineControl HeadLine 
 {
      get { return null; }
      set 
      {
          this.Controls.Add(new HeadLineControl(articlePage.Article)();
      }
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top