我正在尝试做一些我认为非常简单的事情 - 使用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"
时没有显示选项?
答案 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已经回答的内容,但这是你需要做的。