gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:54:07 25 4
gpt4 key购买 nike

我在服务器端代码上创建按钮时遇到了一个小问题。我正在使用 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(控件控件) +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( bool 值 includeStagesBeforeAsyncPoint, bool 值 includeStagesAfterAsyncPoint)+1266

最佳答案

看起来你可能在这里遇到了几个问题:

缺少表单标签

确保您的页面具有指定了“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 控件实现目标,而不是先将某些内容呈现为字符串。

关于c# - Asp.net 按钮对象 - runat 服务器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7993808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com