我在服务器端代码上创建按钮时遇到了一些问题。我正在使用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
答案 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)
如错误所示,您必须将按钮放在标签中。所以很容易将它添加到您的流中。