2010-11-15 61 views
0

這可能是我錯過的基本和愚蠢的東西,但各種解決方法正在導致我非常頭痛,真的,我需要了解這裏的基本問題,以便找到最佳方案。在.net用戶控件下拉不保持狀態

我有一個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的選定值更改爲Render的代碼,但似乎儘管所選值已更改,只要用戶可以看到,但所選值在處理期間仍然是默認值,並被視爲如此。

我也嘗試在會話中設置selectedValue,然後在它填充後立即清除它。這適用於某些場景,但不幸的是,此頁面還包含一些可能導致它回發的JavaScript - 而且您無法從客戶端JavaScript設置會話。所以這個想法不得不離開窗戶。

我在這裏茫然 - 這個顯然簡單的問題已經吃了一整天的時間。任何人都可以告訴我爲什麼狀態不在這個控件上維護,並且/或者建議我在回發後顯示正確的值,而不是將選擇轉換爲永久的值?

乾杯, 馬特

+0

不想成爲smartass,但我會推薦閱讀ASP.NET框架。 [在VB 2008中開始ASP.NET 3.5:從新手到專業,第二版](http://www.amazon.com/gp/product/159059892X?ie=UTF8&tag=aspnettelligent-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=159059892X ) – 2010-11-15 18:48:35

回答

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

+0

謝謝。我不能相信回想起來,我很愚蠢,錯過了這一點。但我只有大約3個小時的睡眠。 – 2010-11-16 09:11:03

+0

睡眠不足是最可怕的事情之一。休息! – Greg 2010-11-16 13:37:25

1

,我會說,我做我的ASP.NET編程C#前言本,並使用GridView的,但以下應適用於您的情況,無論:

是否有必要使用查詢字符串來保存這些數據?如果您在ASPX頁面上聲明瞭分頁和排序控件,則可以直接在代碼隱藏中訪問它們及其值(如Greg在上面的代碼中演示的,不執行FindControl調用)。用戶控制設置是否阻止了你的操作?你是否在頁面上實例化包含此下拉列表的用戶控件,然後嘗試從頁面的代碼隱藏本身訪問下拉列表的值,而不是用戶控件的代碼?

+0

只是所以你知道原因是因爲我不得不使用自定義的排序和分頁控制,而不是標準的。 – 2010-11-16 09:11:37

+0

Gotcha。我沒有必要處理排序和分頁超出最基本的。 – jwiscarson 2010-11-16 15:34:12

相關問題