私は、Webページ内に1行のメッセージ(ステータス更新、エラーメッセージなど)を表示するための簡単なユーティリティwebcontrolを作成しようとしています。メッセージは、Webコントロール上のメソッドを呼び出すことによってページの他のコントロールから来ます。コントロールがレンダリングされるまでにメッセージがない場合は、ページ上にレンダリングしたくないので、Control.Visible = falseを設定します。これは、非ポストバックレンダリングでも機能するようです。ここで私が使用しているコードです:Controlライフサイクルのどの時点でControl.Visibleがレンダリングを停止しますか?
public class MessageList : WebControl
{
#region inner classes
private struct MessageItem
{
string Content, CssClass;
public MessageItem(string content, string cssClass)
{
Content = content;
CssClass = cssClass;
}
public override string ToString()
{ return "<li" + (String.IsNullOrEmpty(CssClass) ? String.Empty : " class='" + CssClass + "'") + ">" + Content + "</li>"; }
}
private class MessageQueue : Queue<MessageItem> { }
#endregion
#region fields, constructors, and events
MessageQueue queue;
public MessageList() : base(HtmlTextWriterTag.Ul)
{
queue = new MessageQueue();
}
protected override void OnLoad(EventArgs e)
{
this.Controls.Clear();
base.OnLoad(e);
}
protected override void OnPreRender(EventArgs e)
{
this.Visible = (queue.Count > 0);
if (this.Visible)
{
while (queue.Count > 0)
{
MessageItem message = queue.Dequeue();
this.Controls.Add(new LiteralControl(message.ToString()));
}
}
base.OnPreRender(e);
}
#endregion
#region properties and methods
public void AddMessage(string content, string cssClass)
{ queue.Enqueue(new MessageItem(content, cssClass)); }
public void AddMessage(string content)
{ AddMessage(content, String.Empty); }
#endregion
}
私は同じ結果で、あまりにもCreateChildControlsの内部チェックを入れてみました。
CssClassまたはhtmlエンコードのコンテンツをエンコードする属性ではないため、他の場所で実行されていない場合は、インジェクション攻撃を受けやすくなることに注意してください。 – daveidmx