這可能是我錯過的基本和愚蠢的東西,但各種解決方法正在導致我非常頭痛,真的,我需要了解這裏的基本問題,以便找到最佳方案。在.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設置會話。所以這個想法不得不離開窗戶。
我在這裏茫然 - 這個顯然簡單的問題已經吃了一整天的時間。任何人都可以告訴我爲什麼狀態不在這個控件上維護,並且/或者建議我在回發後顯示正確的值,而不是將選擇轉換爲永久的值?
乾杯, 馬特
不想成爲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