Объект кнопки Asp.net - проблема с сервером runat - PullRequest
5 голосов
/ 03 ноября 2011

У меня небольшая проблема с созданием кнопки на стороне сервера. Я использую stringbuilder для построения таблицы в html, и я хочу создать новый объект кнопки и передать его в мой объект stringbuilder. У меня проблема в том, что моя страница не компилируется во время отладки. Я хочу дать моему объекту кнопки свойство runat = "server", но я не знаю, как это сделать.

Button add_img_popup = new Button();
            add_img_popup.Text = "Add new Image"; // text
            add_img_popup.Click += new EventHandler(addImgPopup_Click); // click event handler
            add_img_popup.Enabled = true;
            add_img_popup.ID = "btn_add_img_popup"; // programmatic id

            Page.Controls.Add(add_img_popup); // add to page controls so it renders

            st.Append("<tr>");
            st.Append("<td>");
            st.Append(add_img_popup); // pass to string builder
            st.Append("</tbody>");
            st.Append("</table>");

И сообщение, которое сервер дает мне.


Ошибка сервера в «/» приложении.

Элемент управления 'btn_add_img_popup' типа 'Кнопка' должен быть размещен внутри тега формы с runat = server. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Web.HttpException: элемент управления 'btn_add_img_popup' типа 'Button' должен быть помещен в тег формы с runat = server.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.

Трассировка стека:

[HttpException (0x80004005): Элемент управления 'btn_add_img_popup' типа 'Кнопка' должен быть помещен внутри тега формы с runat = server.] System.Web.UI.Page.VerifyRenderingInServerForm (элемент управления) +8702387 System.Web.UI.WebControls.Button.AddAttributesToRender (писатель HtmlTextWriter) +54 System.Web.UI.WebControls.WebControl.RenderBeginTag (писатель HtmlTextWriter) +20 System.Web.UI.WebControls.WebControl.Render (писатель HtmlTextWriter) +20 System.Web.UI.Control.RenderControlInternal (средство записи HtmlTextWriter, адаптер ControlAdapter) +27 System.Web.UI.Control.RenderControl (средство записи HtmlTextWriter, адаптер ControlAdapter) +99 System.Web.UI.Control.RenderControl (писатель HtmlTextWriter) +25 System.Web.UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, дети ICollection) +134 System.Web.UI.Control.RenderChildren (писатель HtmlTextWriter) +19 System.Web.UI.Page.Render (писатель HtmlTextWriter) +29 System.Web.UI.Control.RenderControlInternal (средство записи HtmlTextWriter, адаптер ControlAdapter) +27 System.Web.UI.Control.RenderControl (средство записи HtmlTextWriter, адаптер ControlAdapter) +99 System.Web.UI.Control.RenderControl (писатель HtmlTextWriter) +25 System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 1266

Ответы [ 4 ]

5 голосов
/ 03 ноября 2011

Похоже, у вас может быть несколько проблем здесь:

Отсутствует тег формы

Убедитесь, что на вашей странице указан тег формы с указанием 'runat = server'.

<form id="form1" runat="server">
    <asp:PlaceHolder ID="ph1" runat="server"/>
</form>

Код сзади:

// Create the button control
Button add_img_popup = new Button();
add_img_popup.Text = "Add new Image";

// Add it the placeholder
// (which is inside the form)
ph1.Controls.Add(add_img_popup);

Кнопка, добавляемая в stringbuilder

Добавление элемента управления в строитель строк не приведет к его визуализации. Сначала вам нужно будет отобразить элемент управления в строку, используя что-то вроде этого:

public string RenderControl(Control ctrl) 
{
    StringBuilder sb = new StringBuilder();
    StringWriter tw = new StringWriter(sb);
    HtmlTextWriter hw = new HtmlTextWriter(tw);

    ctrl.RenderControl(hw);
    return sb.ToString();
}

Вы можете использовать метод RenderControl следующим образом:

st.Append("<tr>");
st.Append("<td>");
st.Append(RenderControl(add_img_popup));
st.Append("</tbody>");
st.Append("</table>");

Хотя при этом будет отображаться элемент управления, у вас могут возникнуть проблемы с обработкой события обратной передачи (addImgPopup_Click), так как элемент управления должен быть заново создан при каждой загрузке страницы.

Зачем вам нужно добавлять элемент управления в StringBuilder, а не помещать элемент управления прямо на страницу? Как правило, существуют более эффективные способы достижения цели с использованием существующих элементов управления ASP.NET, а не визуализация чего-либо в строку.

3 голосов
/ 03 ноября 2011

не делайте этого:

Page.Controls.Add(add_img_popup);
У

есть div с runat=server на вашей странице внутри тега Form, и если div называется myDiv, то сделайте следующее:

myDiv.Controls.Add(add_img_popup);
0 голосов
/ 03 ноября 2011

Как говорит ошибка, вы должны поместить свою кнопку в тег. так легко добавить его в свой поток.

0 голосов
/ 03 ноября 2011

Есть еще один способ сделать это ...

Поместите <asp:button на страницу, создайте для нее событие щелчка, а затем отметьте его как скрытое. Затем, когда вы строите свою таблицу, вам просто нужно закодировать в обычную HTML-кнопку с событием OnClick для запуска обратного вызова кнопок ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...