リンク用ジェネリック カスタムデザイナ

HyperLink を生成するようなWebカスタムコントロールを作ることも結構ある。これに対するカスタムデザイナを generic class で作成してみた。

参考: http://msdn.microsoft.com/ja-jp/library/cc438234.aspx

using System;
using System.IO;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.WebControls;

namespace Circlems.Leaf.CheckoutLib
{
    /// <summary>
    /// リンクDesigner を利用するクラスに必要な interface
    /// </summary>
    internal interface IリンクDesigner
    {
        /// <summary>
        /// リンクの表示文字列
        /// </summary>
        string DesignerText { get; }
        string DesignerUrl { get; }
    }

    /// <summary>
    /// デザイン時に HyperLink  として表示する generic Designer
    /// </summary>
    /// <typeparam name="T">Webカスタムコントロールのクラス</typeparam>
    internal class リンクDesigner<T> : ControlDesigner where T : Control, IリンクDesigner
    {
        public override string GetDesignTimeHtml()
        {
            var ctl = (T) Component;
            if (String.IsNullOrEmpty(ctl.DesignerText)) return GetEmptyDesignTimeHtml();

            using (var sw = new StringWriter())
            using (var hw = new HtmlTextWriter(sw))
            {
                var link = new HyperLink {Text = ctl.DesignerText, NavigateUrl = ctl.DesignerUrl};
                link.RenderControl(hw);
                return sw.ToString();
            }
        }
    }
}

使用例は大体こんな感じ。クラスに IリンクDesigner を実装して、DesignerAttribute 属性をつけてやるだけ。

    [DefaultProperty("Text")]
    [ToolboxData("<{0}:カスタムリンク runat=\"server\" />")]
    [Designer(typeof(リンクDesigner<カスタムリンク>))]
    public class カスタムリンク : Control, IリンクDesigner
    {
        string IリンクDesigner.DesignerText
        {
            get { return Text; }
        }

        string IリンクDesigner.DesignerUrl
        {
            get { return NavigateUrl; }
        }
...
    }

HyperLink を直接継承した場合はこんなことしなくてもいいのかもしれないが、HiddenField や JavaScript を子コントロールではなく並列にくっつけたい。なので、Control を継承して子コントロールとして HyperLink を持つような実装にすることが多い。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。