C#生成的动态控件不显示

C#生成的动态控件不显示,c#,asp.net,checkboxlist,htmltextwriter,C#,Asp.net,Checkboxlist,Htmltextwriter,我的一页上有以下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:checkboxlis

我的一页上有以下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>");
    }
受保护的覆盖无效渲染(HtmlTextWriter)
{
//此处显示一个名为fieldNames的数组
作者:写(“”);
作者:写(“”);
对于(int count=0;count
其目的是创建一个复选框列表,这些复选框的属性是动态设置的

运行时不会抛出任何错误,但页面上不会显示任何控件

当我查看页面的源代码时,会得到以下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>

出于兴趣,我在另一个应用程序中发布了这篇文章,它运行良好,显示了所有控件

这是事件调用顺序的问题吗?我有点不知所措,不知道下一步该做什么,所以任何建议都很好

谢谢


Oliver

您正在呈现服务器端代码-浏览器无法理解

在呈现页面之前,必须将
复选框列表及其
列表项添加到表单中


服务器端控件为浏览器呈现html—它通常是通过Asp.Net解析服务器端标记创建的。

您呈现的是服务器端代码—浏览器不理解

在呈现页面之前,必须将
复选框列表及其
列表项添加到表单中


服务器端控件为浏览器呈现html—通常,它是通过Asp.Net解析服务器端标记创建的。

基本上,您不能这样做

呈现事件在页面生命周期中出现得很晚。您不能只输出ASPX标记,因为解析标记、实例化控件等的事件已经运行

您应该做的是在标记中向页面添加占位符控件,然后在早期事件(例如Init或Load)中添加要添加到该占位符的控件。同样,您不能仅仅写出ASPX标记,但是,您需要按照以下方式实例化控件:

var checkbox = new CheckboxList { Id = "checkBoxes" };
uxPlaceHolder.Controls.Add(checkbox);
checkbox.Items.Add(new ListItem { Text = "...", Value = "..." });

实现所需的一种方法是使用VirtualPathProvider为框架请求的.aspx请求生成标记。或者,您可以查看您实际想要生成的HTML输出(即带有一些相关javascript的输入元素列表),并直接呈现这些输出。然而,这两种情况都应该被归类为恶意黑客。

基本上你不能这样做

呈现事件在页面生命周期中出现得很晚。您不能只输出ASPX标记,因为解析标记、实例化控件等的事件已经运行

您应该做的是在标记中向页面添加占位符控件,然后在早期事件(例如Init或Load)中添加要添加到该占位符的控件。同样,您不能仅仅写出ASPX标记,但是,您需要按照以下方式实例化控件:

var checkbox = new CheckboxList { Id = "checkBoxes" };
uxPlaceHolder.Controls.Add(checkbox);
checkbox.Items.Add(new ListItem { Text = "...", Value = "..." });

实现所需的一种方法是使用VirtualPathProvider为框架请求的.aspx请求生成标记。或者,您可以查看您实际想要生成的HTML输出(即带有一些相关javascript的输入元素列表),并直接呈现这些输出。但是,这两种可能都应该被归类为恶意黑客。

您直接将html内容写入浏览器,因此您应该只使用html标记。

您直接将html内容写入浏览器,因此您应该只使用html标记。

很公平-有没有办法早点调用这种脚本?我曾考虑过使用page_load事件,但恐怕我不知道事件的调用顺序。您不能在页面生命周期中添加声明性ASPX标记。为什么?因为“页面”是一个.Net对象,所以它是通过将声明性标记与代码隐藏相结合来编译的。代码隐藏运行时,标记已被解析,页面对象已创建。从那时起,您需要处理控制树(即通过解析标记创建的实例化对象)。这很好-它很容易,而且比一起咀嚼文本标记更不容易出错。感谢这一点-占位符的想法对我来说很好。谢谢你的帮助:)没问题。仅供参考,您的下一步可能是将此代码包装到自定义服务器端控件中(即,创建一个从CompositeControl继承的新类,并在此类的事件中实例化控件)。看见这样你的控件生成代码就可以被隔离和重用了。很公平-有没有办法早点调用这种脚本?我曾考虑过使用page_load事件,但恐怕我不知道事件的调用顺序。您不能在页面生命周期中添加声明性ASPX标记。为什么?因为“页面”是一个.Net对象,所以它是通过将声明性标记与代码隐藏相结合来编译的。代码隐藏运行时,标记已被解析,页面对象已创建。从那时起,您需要处理控制树(即通过解析标记创建的实例化对象)。这很好-它很容易,而且比一起咀嚼文本标记更不容易出错。感谢这一点-占位符的想法对我来说很好。谢谢你的帮助:)没问题。仅供参考,您的下一步可能是将此代码包装到自定义服务器端控件中(即,创建一个从CompositeControl继承的新类,并在此类的事件中实例化控件)。看见通过这种方式,控件生成代码是隔离的和可重用的。