【发布时间】:2010-11-15 17:00:39
【问题描述】:
这可能是我错过的基本而愚蠢的事情,但各种解决方法让我非常头疼,我需要了解这里的基本问题才能找到最佳解决方案。
我有一个包含下拉列表的用户控件。
<asp:DropDownList ID="ddlOrderStatus" AutoPostBack="true" runat="server" CssClass="textbox">
<asp:ListItem value="8">Pending</asp:ListItem>
<asp:ListItem value="9">On Hold</asp:ListItem>
<asp:ListItem Value="11">Complete</asp:ListItem>
<asp:ListItem Value="12">Cancelled</asp:ListItem>
</asp:DropDownList>
它在 Page_Load 事件中什么都不做。
这又包含在一个页面中,在它的 Page_Load 事件中,对页面上的某些转发器控件进行了一些数据绑定,但不触及包含 ddl 的控件。页面上没有ajax。
下拉列表 - 显然 - 设置为 autopostback = true。回发代码如下所示:
Private Sub ddlOrderStatus_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlOrderStatus.SelectedIndexChanged
Dim ddl As DropDownList = DirectCast(sender, DropDownList)
Dim currentsorting As String = Request.QueryString("sort")
Dim currentpaging As String = Request.QueryString("page")
Response.Redirect(String.Format("~/admin/orders/Manage/0?sort={0}&page={1}&status={2}", currentsorting, currentpaging, ddl.SelectedValue))
End Sub
所以当 ddl 发生变化时,页面实际上会进行双重回发。我认为没有办法避免这种情况,因为我需要进行回发以获取 ddl 中的值,然后再进行一次回发以根据该值从服务器获取一些新数据。
无论如何,总而言之,当您这样做时,下拉列表无法保持其状态。因此,您选择一个值,代码完成它应该做的工作 - 获取选定的值然后再次回发返回新的预期数据集 - 然后再次加载下拉列表返回其默认形式。
由于这种双重回发,这对我来说是一个有害的问题:如果我尝试将 ddl 的值设置为等于我拥有的查询字符串中的值,则有效地将其永久设置为该值,因为 Page_Load - 其中的值已设置 - 在处理事件之前发生,因此值保持不变。我尝试将更改 ddl 的 selectedvalue 的代码移动到 Render 中,但似乎尽管用户可以看到选择的值已经改变,但在处理过程中选择的值仍然是默认值,并被视为这样。
我还尝试在会话中设置 selectedValue,然后在填充后立即清除它。这适用于某些情况,但不幸的是,此页面还包含一些可能导致其回发的 javascript - 您无法从客户端 javascript 设置会话。所以这个想法不得不放弃。
我在这里不知所措 - 这个看似简单的问题已经占用了我一整天的时间。谁能告诉我为什么没有在这个控件上维护状态和/或建议一种方法让我在回发后显示正确的值而不将选择变成永久的?
干杯, 马特
【问题讨论】:
-
不想成为一个聪明人,但我建议阅读 ASP.NET 框架。 Beginning ASP.NET 3.5 in VB 2008: From Novice to Professional, Second Edition