Próbuję napisać proste narzędzie webcontrol do wyświetlania komunikatów jednoliniowych na stronie internetowej - aktualizacje statusu, komunikaty o błędach itp. Komunikaty będą pochodzić z innych elementów sterujących na stronie, wywołując metodę na kontrolerze sieciowym. Jeśli formant nie ma żadnych komunikatów do czasu renderowania, nie chcę, aby był renderowany na stronie - chcę ustawić Control.Visible = false. Wydaje się to jednak działać tylko w przypadku renderowania bez odświeżania. Oto kod, którego używam:W którym momencie cyklu kontrolnego działa Kontrola. Czy możliwe jest zatrzymanie renderowania?
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
}
Próbowałem również wstawić czek do CreateChildControls z tym samym wynikiem.
Należy pamiętać, że skoro nie jest to atrybut kodujący zawartość kodu CssClass lub kod HTML, użytkownik może być podatny na ataki przy użyciu wstrzykiwań, jeśli nie jest to robione gdzie indziej. – daveidmx