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

我在服务器端代码上创建一个按钮时遇到了一些问题。 我正在使用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(""); st.Append(""); st.Append(add_img_popup); // pass to string builder st.Append(""); st.Append(""); 

以及服务器给我的消息。


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

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

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

来源错误:

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

堆栈跟踪:

[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.Co ntrol.RenderControl(HtmlTextWriter writer,ControlAdapter adapter)+99 System.Web.UI.Control.RenderControl(HtmlTextWriter writer)+25 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+1266

不要这样做:

 Page.Controls.Add(add_img_popup); 

在Form标签内的页面中有一个带有runat=server的div,如果div被称为myDiv那么执行以下操作:

 myDiv.Controls.Add(add_img_popup); 

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

缺少表单标记

确保您的页面具有指定了“runat = server”的表单标记。

 

代码背后:

 // 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(""); st.Append(""); st.Append(RenderControl(add_img_popup)); st.Append(""); st.Append(""); 

虽然这将呈现控件,但您可能在处理回发事件(addImgPopup_Click)时遇到一些问题,因为必须在每次页面加载时重新创建控件。

为什么需要将控件添加到StringBuilder而不是直接将控件放在页面上? 通常使用现有ASP.NET控件实现目标的方法更好,而不是先将字符串呈现给字符串。

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

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

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