質問

ネストされたサーバーコントロールを含むサーバーコントロールがあります

<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が作成されると、ネストされたサーバーコントロールのインスタンスが、System.Web.Ui.Controlクラスに定義されたデフォルトコンストラクターを使用して.NETフレームワークによって作成されることです。例:

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定義のコンストラクターの代わりに、コントロールの基本クラスコンストラクターを呼び出すには、.Netのデフォルトの動作を呼び出すか、オーバーライドする必要があります。つまり、HeadLineControlの新しいインスタンスが作成される場合、 ControlBase(Article article)コンストラクターによって作成される必要があります。

これは可能ですか?可能であれば、どのようにこれを達成しますか?

役に立ちましたか?

解決

この間、回避策としてこれを実行しましたが、より良い方法が必要ですか?

[PersistenceMode(PersistenceMode.InnerProperty)]
 public HeadLineControl HeadLine 
 {
      get { return null; }
      set 
      {
          this.Controls.Add(new HeadLineControl(articlePage.Article)();
      }
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top