웹 페이지에 한 줄 메시지 (상태 업데이트, 오류 메시지 등)를 표시하는 간단한 유틸리티 webcontrol을 작성하려고합니다. 메시지는 웹 컨트롤에서 메서드를 호출하여 페이지의 다른 컨트롤에서 가져옵니다. 컨트롤이 미리 랜더링 될 때까지 메시지가 없다면 페이지에 렌더링을 원하지 않습니다. Control.Visible = false로 설정하고 싶습니다. 이것은 포스트 백 렌더링이 아닌 경우에만 작동하는 것처럼 보입니다. 여기에 내가 사용하고 코드는 다음과 같습니다컨트롤 수명주기의 어느 시점에서 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 내부 검사를 넣어했습니다.
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.Visible = (queue.Count > 0);
if (this.Visible)
{
while (queue.Count > 0)
{
MessageItem message = queue.Dequeue();
this.Controls.Add(new LiteralControl(message.ToString()));
}
}
}
콘텐츠를 CssClass 또는 html로 인코딩하는 특성이 아니기 때문에 다른 곳에서 수행되지 않는 경우 주입 공격에 취약 할 수 있습니다. – daveidmx