Asp.net按钮对象 - runat服务器问题

时间:2011-11-03 11:05:24

标签: c# asp.net button

我在服务器端代码上创建按钮时遇到了一些问题。我正在使用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>");

服务器给我的消息。


'/'应用程序中的服务器错误。

“Button”类型的控件'btn_add_img_popup'必须放在带有runat = server的表单标签内。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Web.HttpException:类型为“Button”的控件“btn_add_img_popup”必须放在带有runat = server的表单标记内。

来源错误:

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

堆栈追踪:

[HttpException(0x80004005):“Button”类型的控件'btn_add_img_popup'必须放在带有runat = server的表单标签内。    System.Web.UI.Page.VerifyRenderingInServerForm(Control control)+8702387    System.Web.UI.WebControls.Button.AddAttributesToRender(HtmlTextWriter writer)+54    System.Web.UI.WebControls.WebControl.RenderBeginTag(HtmlTextWriter writer)+20    System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer)+20    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter)+27    System.Web.UI.Control.RenderControl(HtmlTextWriter writer,ControlAdapter adapter)+99    System.Web.UI.Control.RenderControl(HtmlTextWriter writer)+25    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)+134    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)+19    System.Web.UI.Page.Render(HtmlTextWriter writer)+29    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter)+27    System.Web.UI.Control.RenderControl(HtmlTextWriter writer,ControlAdapter adapter)+99    System.Web.UI.Control.RenderControl(HtmlTextWriter writer)+25    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+1266

4 个答案:

答案 0 :(得分:5)

看起来你可能会遇到一些问题:

缺少表单标记

确保您的网页包含指定了“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

将控件添加到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控件实现目标,而不是先将字符串渲染为字符串。

答案 1 :(得分:3)

不要这样做:

Page.Controls.Add(add_img_popup);

在Form标记内的页面中有runat=server的div,如果div被称为myDiv,请执行以下操作:

myDiv.Controls.Add(add_img_popup);

答案 2 :(得分:0)

还有另一种方法可以做到这一点......

在页面上放置<asp:button,为其创建点击事件,然后将其标记为隐藏。然后,当你构建你的表时,你只需要在一个普通的html按钮中编码一个OnClick事件来触发按钮回调......

答案 3 :(得分:0)

如错误所示,您必须将按钮放在标签中。所以很容易将它添加到您的流中。