.net usercontrol中的下拉列表未维护状态

时间:2010-11-15 17:00:40

标签: asp.net postback

这可能是我错过的基本和愚蠢的事情,但是各种变通办法让我非常头疼,我需要了解这里的基本问题才能找到最佳解决方案。

我有一个usercontrol,其中包含一个下拉列表。

<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的代码移动,但似乎尽管所选值已经改变,只要用户可以看到,所选值仍然是处理期间的默认值,并被视为这样。 / p>

我还尝试在会话中设置selectedValue,然后在填充后立即清除它。这适用于某些场景,但不幸的是这个页面还包含一些可以导致它回发的javascript - 而且你无法从客户端javascript设置会话。所以这个想法不得不走出窗外。

我在这里不知所措 - 这个看似简单的问题已经耗费了我整整一天的时间。任何人都可以告诉我为什么状态不是在这个控件上维护和/或建议我在回发后让它显示正确的值而不将选择变成永久的值?

干杯, 马特

2 个答案:

答案 0 :(得分:2)

在你的页面加载中:

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

这样做

答案 1 :(得分:1)

我将在前言中说我在C#中进行ASP.NET编程并使用GridViews,但以下情况应适用于您的情况,无论如何:

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