【问题标题】:Dropdown in .net usercontrol not maintaining state.net 用户控件中的下拉菜单不保持状态
【发布时间】: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 postback


【解决方案1】:

在您的页面加载中:

// Only set the selected order status when the page first loads, but not on postbacks.
if( !Page.IsPostback )
{
    ddlOrderStatus.SelectedValue = Request.QueryString("status");
}

脚注:

我认为没有办法避免这种情况,因为我需要 进行回发以获取价值 ddl,然后是另一个回发到 从服务器获取一些新数据 基于该值。

你可以用 javascript 来做

【讨论】:

  • 谢谢。回想起来,我简直不敢相信我愚蠢到会错过这个。但我只睡了大约 3 个小时。
  • 睡眠不足是最可怕的事情之一。休息吧!
【解决方案2】:

我会先说我在 C# 中进行 ASP.NET 编程并使用 GridViews,但以下内容应该适用于您的情况:

您是否有必要使用查询字符串来保存这些数据?如果您已在 ASPX 页面上声明了分页和排序控件,则可以直接在代码隐藏中访问它们及其值(正如 Greg 在上面的代码中通过不执行 FindControl 调用演示的那样)。用户控制设置是否阻止您这样做?您是否在页面上实例化包含此下拉列表的用户控件,然后尝试从页面的代码隐藏本身而不是用户控件的隐藏代码访问下拉列表的值?

【讨论】:

  • 您知道原因是因为我不得不使用自定义排序和分页控件而不是标准控件。
  • 明白了。我不必处理最基本的排序和分页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多