将列表项动态添加到ASP.NET中的select标记

时间:2013-11-11 14:02:35

标签: 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 value='" & d.id & "'>" & d.name & "</option>")        
    Next   
 %>
</select>

一切都很好,我的数据库层返回的数据出现在我的选择标记中。

稍后,我记得添加runat = "Server"标记,以便在我的代码隐藏帖子中处理我的数据。但是,添加之后,不会显示任何选项。检查生成的源代码,我看到没有添加任何选项。

这是什么问题?为什么添加runat = "Server"时没有显示选项?

3 个答案:

答案 0 :(得分:2)

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

<强> ASP.NET

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

CODE-BEHIND(在Page_Load中)

If Not Page.IsPostBack Then
    Dim periods As Generic.List(Of Models.Duration) = DBSupport.getDurations
    cmbDuration.DataSource = periods
    cmbDuration.DataBind()
End If

答案 1 :(得分:0)

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

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

如果这有帮助,请告诉我!

答案 2 :(得分:0)

  

所以,我理解这一点的方法是添加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;

此过程在设计时发生。

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

所以你不能简单地说:

<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已经回答的内容,但这是你需要做的。