Пользовательский элемент управления. Количество ноль - PullRequest
4 голосов
/ 07 января 2010

В пользовательском серверном элементе управления я просто записываю количество дочерних элементов управления.

Есть ли причина, по которой счетчик стал бы равным нулю, если теги <%%> используются в теле тегов управления?

Вот мой чрезвычайно упрощенный элемент управления:

public class Script : Control
{
    public override void RenderControl(HtmlTextWriter writer)
    {            
        writer.Write(this.Controls.Count.ToString());
    }

}

Когда передаются только литеральные данные, записанное число равно 1, как и ожидалось:

<my:Script runat="server" ID="script3" >
   function foo(){}
</my:Script>

Когда передаются литеральные данные и некоторые вычисленные данные, счетчик обнуляется:

<my:Script ID="Script1" runat="server" >
   function foot(){}
   <%=String.Empty %>
</my:Script>

В String.Empty нет ничего особенного. Все, что я здесь добавлю, приведет к нулю.

Интересно, что другие теги Control работают нормально. Следующие пункты 3:

<my:Script runat="server" ID="Script2">
   hi   
  <asp:HyperLink runat="server" NavigateUrl="/" Text="hi" />
</my:Script>

Есть ли другой способ получить дочерний "контент" пользовательского элемента управления? Я бы подумал, что есть какой-то способ, но он может проверять только метаданные для System.Web.UI.WebControls.Content, но не реализацию.

Ответы [ 2 ]

4 голосов
/ 07 января 2010

Невозможно изменить коллекцию Controls, если в вашем элементе управления есть теги <%%> в теле (если вы попытаетесь что-то Add, вы получите исключение, объясняющее именно это). По той же причине коллекция Controls фактически пуста. Вы можете проверить, являются ли коллекции пустыми из-за тегов <%%>, используя свойство Controls.IsReadOnly.

1 голос
/ 10 января 2010

Оказывается, ответ был намного проще, чем подход, который я использовал в первую очередь. Просто вызовите переопределенный метод RenderControl с вашим собственным HtmlTextWriter, а затем используйте захваченную разметку, как вам угодно.

var htmlString = new StringBuilder();
var mywriter = new HtmlTextWriter(new StringWriter(htmlString));
base.RenderControl(mywriter);

Теперь отображаемая разметка доступна в htmlString независимо от тегов <%%>, используемых в теле элемента управления.

...