2009-08-10 81 views
8

我遇到問題。UpdatePanel中的DropDownList

在我的項目中,我已經在updatepanel中放置了一個下拉列表。我想要做的是從dropdownlist中選擇一個值並在會話中使用它。

但無論我做什麼,它總是會給我空值,因爲沒有選中「Enable AutoPostBack」。當我這樣做時,它會刷新頁面,所以這不是我想要的。

我該如何解決這個問題?

任何想法...

回答

19

這聽起來像你可能沒有正確使用UpdatePanel功能。如果您將UpdatePanel設置爲在兒童觸發事件時進行更新,則只應刷新UpdatePanel,而不是整個頁面。下面的代碼似乎與你正在尋找的類似。在更改下拉列表時,只有更新面板回發到服務器,並且當您刷新頁面時,您可以從會話中獲取值。

ASPX CODE

<form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div> 
     Current Time: <asp:Label ID="lblTime" runat="server" /><br /> 
     Session Value: <asp:Label ID="lblSessionValue" runat="server" /><br /> 
     <br /> 
     <asp:UpdatePanel ID="upSetSession" runat="server"> 
      <ContentTemplate> 
       <asp:DropDownList ID="ddlMyList" runat="server" 
        onselectedindexchanged="ddlMyList_SelectedIndexChanged" 
        AutoPostBack="true"> 
        <asp:ListItem>Select One</asp:ListItem> 
        <asp:ListItem>Maybe</asp:ListItem> 
        <asp:ListItem>Yes</asp:ListItem> 
       </asp:DropDownList> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="ddlMyList" 
        EventName="SelectedIndexChanged" /> 
      </Triggers> 
     </asp:UpdatePanel> 
    </div> 
</form> 

後面的代碼

protected void Page_Load(object sender, EventArgs e) 
    { 
     this.lblTime.Text = DateTime.Now.ToShortTimeString(); 
     if (Session["MyValue"] != null) 
      this.lblSessionValue.Text = Session["MyValue"].ToString(); 
    } 

    protected void ddlMyList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Session.Remove("MyValue"); 
     Session.Add("MyValue", this.ddlMyList.SelectedValue); 
    } 
+0

oke現在我發現了一種方法如何解決這個問題,我認爲。我說我動態調用7 ascx文件在updatepanel.if我使用If(IsPostBack)Then .... End If 也許我可以讓它工作 – iersoy 2009-08-10 20:44:57

+0

我通常添加如果(IsPostback)檢查我的頁面加載和頁面初始化函數,如果他們有任何內容... – RSolberg 2009-08-10 21:47:18

+0

@RSolberg:你救了我的一天! – 2012-12-11 20:56:21

3

爲了獲取存儲到會話的任何內容,您必須將其提交給服務器。

也許關於爲什麼不希望UpdatePanel刷新的更多細節會有所幫助,並且您正嘗試使用Session中的值來完成該操作。

編輯:根據您的意見,在我看來,解決方案將存儲當前.ascx文件在會話中,並設置您的DropDownList啓用autopostback。

因此,在您處理「下一步」和「後退」按鈕時,將正確的.ascx指示符存儲到會話中。

在回發處理dropdownlist事件期間,您可以通過檢查會話以顯示正確的文件,簡單地確保當前的.ascx文件仍在顯示。當結果返回給客戶端時,沒有任何內容會發生變化,因爲UpdatePanel足夠聰明,可以實現相同的內容,並且您將成功處理下拉列表值。

+0

嗯,我已經創建了像精靈structure.and其非常複雜actually.but讓我告訴üthis.i有7 .ascx文件,並在我的Default.aspx文件在我的updatepanel中有ScriptManager和UpdatePanel,通過使用Next和Back按鈕,我動態調用這些.ascx文件,因此它提供了一個類似於嚮導的視圖。如果我autopostback我的dropdownlist,它將返回到名爲page1.ascx的第一個webusercontrol。這是不能接受me.im試圖找到一個解決方案,但還沒有找到 – iersoy 2009-08-10 20:19:21

+0

,並通過使用會議im計劃存儲全局變量用於其他.ascx文件。 – iersoy 2009-08-10 20:22:09

+0

我更新了我的答案,併爲您提供了一個可能的解決方案。 – womp 2009-08-10 20:48:43

1

這聽起來像你正在做更多的工作比你需要在這裏。你有沒有看過使用ASP.NET嚮導控件? http://msdn.microsoft.com/en-us/magazine/cc163894.aspx或只是谷歌它。因爲會話是一個服務器端的概念,所以如果你仍然想按照你的方式做,你的提交給服務器(無需autopostback +手動提交按鈕點擊,或啓用autopostback)。 HTTP是一種無狀態協議,因此唯一的狀態概念必須在HTTP域之外完成。這意味着你堅持在服務器上存儲狀態(例如,在會話中),或者更嚴格地說,在客戶端的計算機上(例如在cookie中)存儲狀態。

+0

謝謝,我會看着它。 – iersoy 2009-08-10 20:39:48

1

非常感謝我在Page_Load事件控制變量解決的問題。

If Label1.Text = 1 Then 
    Dim tempcontrol2 As Control = LoadControl("Page1.ascx") 
    PlaceHolder1.Controls.Add(tempcontrol2) 

ElseIf Label1.Text = 2 Then 
    Dim tempcontrol2 As Control = LoadControl("Page2.ascx") 
    PlaceHolder1.Controls.Add(tempcontrol2) 
End If 

感謝ü所有答案

相關問題