1

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

我把我的代码写成:

<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"

4

3 回答 3

2

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

ASP.NET

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

代码隐藏(在 Page_Load 中)

If Not Page.IsPostBack Then
    Dim periods As Generic.List(Of Models.Duration) = DBSupport.getDurations
    cmbDuration.DataSource = periods
    cmbDuration.DataBind()
End If
于 2013-11-11T15:00:32.350 回答
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 已经回答的内容,但这是您需要做的。

于 2013-11-11T15:19:48.547 回答
0

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

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

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

于 2013-11-11T14:35:48.793 回答