我的一个页面上有以下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>
出于兴趣,我在另一个应用程序中发布了它,它运行正常,显示了所有控件。
这是调用事件的顺序的问题吗?我对于接下来要尝试什么感到有点失落,所以任何建议都会很棒。
谢谢,
奥利弗
答案 0 :(得分:1)
基本上你不能这样做。
Render事件在页面生命周期中很晚才出现。您不能只输出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的输入元素列表)并直接渲染它们。但是,这些都可能被归类为令人讨厌的黑客。
答案 1 :(得分:0)
您正在渲染服务器端代码 - 浏览器无法理解。
您必须在页面呈现之前将CheckBoxList
及其ListItem
添加到表单。
服务器端控件为浏览器呈现html - 通常由Asp.Net解析服务器端标记。
答案 2 :(得分:0)
您直接将html内容写入浏览器,因此您应该只使用html标记。