我的一个页面上有以下c#代码:
protected override void Render(HtmlTextWriter writer)
{
//an array named fieldNames is delcared here
writer.Write("<form id="Form1" runat="server" action="">");
writer.Write("<asp:checkboxlist id="checkBoxes" runat="server">");
for (int count = 0; count < fieldNames.GetLength(0); count++)
{ //iterates over the array of field names
writer.Write("<asp:listitem text=" + fieldNames[count] + " value=" + fieldNames[count] + "/>");
}
writer.Write("</asp:checkboxlist>");
writer.Write("</form>");
}
目的是创建一个动态设置属性的复选框列表。
运行时不会抛出任何错误,但页面上没有出现任何控件。
当我查看页面的源代码时,我得到以下html:
<form id="Form1" runat="server" action="">
<asp:checkboxlist id="checkBoxes" runat="server">
<asp:listitem text='Spares Part No' value='Spares Part No'/>
<asp:listitem text='Description' value='Description'/>
<asp:listitem text='Site' value='Site'/>
<asp:listitem text='Rack/Bin Number' value='Rack/Bin Number'/>
</asp:checkboxlist>
</form>
出于兴趣,我将此发布在另一个应用程序中,它运行良好,所有控件都显示。
事件调用的顺序有问题吗?我有点不知所措,不知道下一步该尝试什么,所以任何建议都会很好。
谢谢,奥利弗
基本上你不能这么做。
渲染事件在页面生命周期中很晚才出现。你不能只输出ASPX标记,因为解析标记的事件,实例化控件等已经运行。
你应该做的是在你的页面标记中添加一个PlaceHolder控件,然后在早期的事件(例如Init或Load)中添加你想要的控件到那个占位符。同样,您不能只写出ASPX标记,但是,您需要实例化控件,沿着以下行:
var checkbox = new CheckboxList { Id = "checkBoxes" };
uxPlaceHolder.Controls.Add(checkbox);
checkbox.Items.Add(new ListItem { Text = "...", Value = "..." });
你可以实现你想要的一种方法是使用VirtualPathProvider在框架请求时为.aspx请求生成标记。或者你可以看看你真正想要生成的HTML输出(例如,带有一些相关javascript的输入元素列表)并直接呈现这些。然而,这两种方法都应该被归类为恶意攻击。
您正在呈现浏览器无法理解的服务器端代码。
您必须在页面呈现之前将CheckBoxList
及其ListItem
添加到表单中。
服务器端控件为浏览器呈现html——它通常由Asp. js创建。Net解析服务器端标记
你直接写html内容到浏览器,所以你应该只使用html标签。