メッセージリストコントロール

メッセージを手軽に扱うためのカスタムコントロール

コード

MessageList.cs

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

namespace Sample.Controls
{
    [DefaultProperty("Items")]
    [ParseChildren(true, "Items")]
    [PersistChildren(false)]
    public class MessageList : CompositeControl
    {
        public MessageList()
        {
            this._items = new List<Message>();
        }


        private readonly List<Message> _items;


        [MergableProperty(false)]
        [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
        public List<Message> Items
        {
            get
            {
                return this._items;
            }
        }


        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Ul;
            }
        }


        public void ShowMessage(string messageId)
        {
            this.SetVisibleOfMessage(messageId, true);
        }

        public void HideMessage(string messageId)
        {
            this.SetVisibleOfMessage(messageId, false);
        }

        public void ShowAllMessages()
        {
            this.SetVisibleOfAllMessages(true);
        }

        public void HideAllMessages()
        {
            this.SetVisibleOfAllMessages(false);
        }


        private void SetVisibleOfMessage(string messageId, bool visible)
        {
            Message target = this._items.Find(item => string.Equals(item.ID, messageId, StringComparison.Ordinal));
            target.Visible = visible;
        }

        private void SetVisibleOfAllMessages(bool visible)
        {
            this._items.ForEach(item => item.Visible = visible);
        }


        protected override void CreateChildControls()
        {
            foreach (Message item in this._items)
            {
                this.Controls.Add(item);
            }
        }
    }
}

Message.cs

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

namespace Sample.Controls
{
    public class Message : WebControl
    {
        public Message()
            : base(HtmlTextWriterTag.Li)
        {
        }


        public string Text
        {
            get
            {
                return (this.ViewState["Text"] as string) ?? string.Empty;
            }
            set
            {
                this.ViewState["Text"] = value;
            }
        }


        public void Show()
        {
            this.Visible = true;
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write(this.Text);
        }
    }
}

使用例

Execute.aspx (1)

<%@ Register Assembly="Sample" Namespace="Sample.Controls" TagPrefix="my" %>

Execute.aspx (2)

<my:MessageList runat="server" ID="_errorMessageList" CssClass="ErrorMessageList">
    <my:Message runat="server" ID="_hogeErrorMessage" Text="Hoge です。" />
    <my:Message runat="server" ID="_fugaErrorMessage" Text="Fuga です。" />
    <my:Message runat="server" ID="_piyoErrorMessage" Text="Piyo です。" />
</my:MessageList>

Execute.css

.ErrorMessageList li
{
    color: Red;
}

Execute.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    this._errorMessageList.HideAllMessages();
}

protected void _okButton_Click(object sender, EventArgs e)
{
    FooFacade.ResultOfExecute result = this._facade.Execute();
    switch (result)
    {
        case (FooFacade.ResultOfExecute.Success):
            this.Response.Redirect("~/Foo/Complete.aspx", false);
            break;

        case (FooFacade.ResultOfExecute.Hoge):
            this._hogeErrorMessage.Show();
            break;

        case (FooFacade.ResultOfExecute.Fuga):
            this._fugaErrorMessage.Show();
            break;

        case (FooFacade.ResultOfExecute.Piyo):
            this._piyoErrorMessage.Show();
            break;

        default:
            throw new ApplicationException();
    }
}