Html 在ASP.NET中将listitems动态添加到选择标记

Html 在ASP.NET中将listitems动态添加到选择标记,html,asp.net,forms,html-select,Html,Asp.net,Forms,Html Select,我正在尝试做一些我认为非常简单的事情——使用ASP.NET在select标记中动态添加一些选项 我将代码编写为: <select id='cmbDuration'> <% Dim periods As Generic.List(Of Models.Duration) = DBSupport.getDurations For Each d As Models.Duration In periods Response.Write("<option v

我正在尝试做一些我认为非常简单的事情——使用ASP.NET在select标记中动态添加一些选项

我将代码编写为:

<select id='cmbDuration'>
<%  Dim periods As Generic.List(Of Models.Duration) = DBSupport.getDurations
    For Each d As Models.Duration In periods
        Response.Write("<option value='" & d.id & "'>" & d.name & "</option>")        
    Next   
 %>
</select>

一切正常,数据库层返回的数据显示在select标记中

后来,我记得添加了一个
runat=“Server”
标记来处理我的代码隐藏帖子中的数据。但是,添加后,将不显示任何选项。检查生成的源代码,我发现没有添加任何选项


这里有什么问题?为什么添加
runat=“Server”
时不显示任何选项?

问题是您正在使用函数Response.Write()写入ASPNET的“响应流”,这将导致输出的选项标记显示在打印响应流的页面的最顶部。这甚至会出现在HTML声明标记的上方。(检查HTML源代码以查看)如果希望将输出直接写入ASPX页面,请尝试以下操作:

<select id='cmbDuration'>
    <%For x As Integer = 0 To 5%>
        <option><%=x%></option>
    <%Next%>
</select>


如果这有帮助,或没有,请让我知道

为什么要在代码隐藏帖子中处理数据,而要编写内嵌代码来生成列表项?您应该在代码隐藏中绑定下拉列表:

ASP.NET

<asp:DropDown ID="cmbDuration" DataTextField="Name" DataValueField="ID" runat="server" />

因此,我的理解是,添加runat=“Server” 属性将导致我的控件可用于后续操作 仅在代码隐藏中处理

否,添加
runat=“server”
会告诉visual studio和编译器此控件将表示为服务器控件。它将服务器控件添加到您的
.designer.cs
文件中:

 /// <summary>
 /// Image3 control.
 /// </summary>
 /// <remarks>
 /// Auto-generated field.
 /// To modify move field declaration from designer file to code-behind file.
 /// </remarks>
 protected global::System.Web.UI.WebControls.Image Image3;
//
///图像3对照。
/// 
/// 
///自动生成的字段。
///将字段声明从设计器文件修改为代码隐藏文件。
/// 
受保护的全局::System.Web.UI.WebControl.Image Image3;
此过程发生在设计时

您的代码(代码中的所有内容)发生在运行时。因此,您可以尝试使用代码块构建动态HTML。所以设计师不知道你要添加什么,你要添加多少控件?我如何表示这一点?因此它无法构建服务器端控制代码。所以它没有。它还导致运行时代码无法处理。它同样不知道控件应该代表什么

所以你不能简单地:

<select id='cmbDuration' runat='server'>
<%  Dim periods As Generic.List(Of Models.Duration) = DBSupport.getDurations
    For Each d As Models.Duration In periods
        Response.Write("<option value='" & d.id & "' runat='server'>" & d.name & "</option>")        
    Next   
 %>
</select>

这只是无效的ASP.Net语法。您不能在运行时以这种方式写入代码。在for循环执行之前。Net已经建立了它所需要的代码隐藏块,所以不能添加到其中


我不打算重复@Scott已经回答的内容,但这是您需要做的。

您应该使用一个可以理解的标签,但是,即使是
asp:DropDownList
也被呈现为
select
标签,为什么要添加
runat=“Server”
导致循环中的代码不会在页面上呈现任何内容?您不能像现在这样将runat=“server”添加到呈现的控件中。您应该将其视为只是呈现一堆字符串(HTML),这是在解析runat=“server”标记之后发生的。因此,您可以添加一个runat=“server”标记,然后在代码隐藏中添加选项,也可以添加一堆HTML,但这在代码隐藏中不可用。您不能同时执行这两项操作,这正是您试图执行的操作。因此,我的理解是,添加
runat=“Server”
属性将导致我的控件仅在代码隐藏中可用于后续进程。我尝试了以下方法,证明了这一点:
-代码块被忽略,复选框保持未选中状态。我必须在代码隐藏中更改其选中状态。谢谢。添加了一个更具描述性的答案。这是关于编译时和运行时的区别。谢谢。我不认为使用
Response.Write
是问题所在-我使用建议的
Response.Write(“&n.ToString&”)在循环内进行测试,这两种方法都有效。一旦添加了
runat=“server”
,它们都没有。为了记录在案,我确实在codebehind中添加了我的listitem添加代码,当然它起了作用,但我仍然不理解最初的问题。当我添加runat=“server”时,这会在VS2012中生成一个编译错误(我绑定了框架2.0、3.5和4.5)。runat=“server”控件中不支持代码块。我仍在使用VS2008。我有多个版本的VS。我尝试了2008、2010和2012。所有这些都给了我以下编译错误:“代码块在此上下文中不受支持。”很抱歉,我也不能在这方面提供帮助。您当然是对的,我只是想知道为什么添加runat=“server”属性会导致循环中的代码根本不被执行。利亚姆的评论帮助我更好地理解了这一点。谢谢你的澄清。
<select id='cmbDuration' runat='server'>
<%  Dim periods As Generic.List(Of Models.Duration) = DBSupport.getDurations
    For Each d As Models.Duration In periods
        Response.Write("<option value='" & d.id & "' runat='server'>" & d.name & "</option>")        
    Next   
 %>
</select>