1

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

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

这是事件调用顺序的问题吗?我不知道接下来要尝试什么,所以任何建议都会很棒。

谢谢,

奥利弗

4

3 回答 3

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 的输入元素列表)并直接呈现它们。然而,这两者都应该被归类为讨厌的黑客。

于 2011-08-12T10:21:25.857 回答
0

您正在渲染服务器端代码 - 浏览器无法理解。

您必须在页面呈现之前将CheckBoxList其及其s 添加到表单中。ListItem

服务器端控件为浏览器呈现 html - 通常由 Asp.Net 解析服务器端标记创建。

于 2011-08-12T10:20:19.587 回答
0

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

于 2011-08-12T10:46:31.360 回答