0

私はいくつかのカスタムユーザーコントロール(100以上)を持っていますが、それらはすべて共通のフォーマットが含まれているため、基本的にユーザーコントロールを宛先ページのパネルコントロールでラップする必要があります。簡単にするために、これを処理する基本コントロールを作成したかったのは、ほとんどすべての基本機能が各カスタムコントロールで同じであるためです。

これを実現するために私が行ったことは、基本クラスを作成し、その基本クラス内にプライベートパネルコントロールを作成してから、Renderをオーバーライドして、base.Renderの周りにパネルのpre/postタグを生成することです。

これは、これを継承している関心のあるすべてのユーザーコントロールと、継承されたコントロールに公開したいくつかのフォーマット項目(Width、CssClassなど)が期待どおりに機能するため、うまく機能します。

私が本当に望んでいるのは、すべてのパネルコントロールアイテムを基本クラスを介して継承されたコントロールに公開することですが、各要素を公開するためにプロパティ/メソッドを正しくする必要はありません。

これに対する最善のアプローチは何かについてのアイデアはありますか?すべてのパネルプロパティ/メソッドを手動で実装したくありません。設計時の属性も使用しますが(1つ目はCssClassとWidthです)、設計時の属性をユーザーに提供しています...

私たちが持っているものはうまくいき、より簡単でより良い解決策を探しています。

using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public class BaseUserControl : System.Web.UI.UserControl
{
    private Panel _panel;
    private bool _isPanelLoaded;

    public Panel Panel
    {
        get
        {
            if (_panel == null)
            {
                _panel = new Panel();
                _isPanelLoaded = true;
            }
            return _panel;
        }
    }

    public BaseUserControl()
    {

    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (_isPanelLoaded)
        {
            Panel.RenderBeginTag(writer);
            base.Render(writer);
            Panel.RenderEndTag(writer);
        }
        else
        {
            base.Render(writer);
        }
    }

    public Unit Width
    {
        get
        {
            if (Panel.Width.IsEmpty)
            {
                return 0;
            }
            return Panel.Width;
        }
        set
        {
            Panel.Width = value;
        }
    }

    public string CssClass
    {
        get
        {
            return Panel.CssClass;
        }
        set
        {
            Panel.CssClass = value;
        }
    }
}
4

1 に答える 1

0

すべてのプロパティを公開するには、Panelコントロールから継承する必要があります。panelプロパティがあるので、そのプロパティにプロパティを設定できます。マークアップでそれらを定義するのは難しいです...ほとんどの単純なオブジェクトでは、プロパティにの属性を<PersistenceMode(PersistenceMode.Attribute)>指定すると、のsytnaxのプロパティにアクセスできますが、Panel-CssClassそれが機能するかどうかはわかりません、Panelはコントロールであるため。試してみてください。

基本的に、必要な属性をラップするプロパティを作成することについて話しているので、前者のソリューションが機能しない場合は、それを実行するのが最善の場合があります。

于 2013-01-22T18:32:32.877 に答える