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

本文关键字:显示 动态控件 | 更新日期: 2023-09-27 18:05:37

我的一个页面上有以下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>

出于兴趣,我将此发布在另一个应用程序中,它运行良好,所有控件都显示。

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

谢谢,奥利弗

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

基本上你不能这么做。

渲染事件在页面生命周期中很晚才出现。你不能只输出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标签。