C # сгенерированные динамические элементы управления не отображаются - PullRequest
1 голос
/ 12 августа 2011

У меня есть следующий код C # на одной из моих страниц:

protected override void Render(HtmlTextWriter writer) 
    {
        //an array named fieldNames is delcared here

        writer.Write("<form id=\"Form1\" runat=\"server\" action=\"\">");
        writer.Write("<asp:checkboxlist id=\"checkBoxes\" runat=\"server\">");
        for (int count = 0; count < fieldNames.GetLength(0); count++)
        {  //iterates over the array of field names
            writer.Write("<asp:listitem text=" + fieldNames[count] + " value=" + fieldNames[count] + "/>");
        }
        writer.Write("</asp:checkboxlist>");
        writer.Write("</form>");
    }

Цель состоит в том, чтобы создать список флажков, атрибуты которых были установлены динамически.

При запуске это не выдает никаких ошибок, но на странице не отображаются элементы управления.

Когда я просматриваю источник страницы, я получаю следующий html:

<form id="Form1" runat="server" action="">
    <asp:checkboxlist id="checkBoxes" runat="server">
        <asp:listitem text='Spares Part No' value='Spares Part No'/>
        <asp:listitem text='Description' value='Description'/>
        <asp:listitem text='Site' value='Site'/>
        <asp:listitem text='Rack/Bin Number' value='Rack/Bin Number'/>
    </asp:checkboxlist>
</form>

Из интереса я разместил это в другом приложении, и оно работает нормально со всеми отображаемыми элементами управления.

Это проблема с порядком, в котором вызываются события? Я немного растерялся из-за того, что делать дальше, поэтому любой совет был бы полезен.

Спасибо

Оливер

Ответы [ 3 ]

1 голос
/ 12 августа 2011

В принципе, вы не можете этого сделать.

Событие Render происходит очень поздно в жизненном цикле страницы. Вы не можете просто вывести разметку ASPX, потому что события, которые анализируют разметку, создают элементы управления и т. Д., Уже запущены.

Что вам нужно сделать, это добавить элемент управления PlaceHolder на вашу страницу в разметке, а затем в более раннем событии (например, Init или Load) добавить элементы управления, которые вы хотите, к этому заполнителю. Опять же, вы не можете просто записать разметку ASPX, однако вам нужно создать экземпляры элементов управления следующим образом:

var checkbox = new CheckboxList { Id = "checkBoxes" };
uxPlaceHolder.Controls.Add(checkbox);
checkbox.Items.Add(new ListItem { Text = "...", Value = "..." });

Одним из способов достижения желаемого результата является использование VirtualPathProvider для генерации разметки для запросов .aspx, когда они запрашиваются платформой. Или вы можете посмотреть, какой вывод HTML вы на самом деле хотите сгенерировать (то есть список элементов ввода с некоторым связанным JavaScript) и визуализировать их напрямую. Однако, оба из них, вероятно, должны быть классифицированы как противные хаки.

0 голосов
/ 12 августа 2011

Вы пишете html-контент напрямую в браузер, поэтому вы должны использовать только html-теги.

0 голосов
/ 12 августа 2011

Вы визуализируете серверный код - который браузер не понимает.

Вы должны добавить CheckBoxList и ListItem s в форму перед отображением страницы.

Серверный элемент управления отображает html для браузера - обычно он создается Asp.Net, анализирующим разметку на стороне сервера.

...