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按钮中编码来触发按钮回调......
如错误所示,您必须将按钮放在标签中。 所以很容易将它添加到您的流中。