ネストされたサーバーコントロール
-
06-07-2019 - |
質問
ネストされたサーバーコントロールを含むサーバーコントロールがあります
<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)();
}
}
所属していません StackOverflow