2011-04-11 35 views
2

爲了加快我的網站,我試圖禁用viewstate,因爲我不認爲我在任何地方都使用它。我有一個用戶控件在default.aspx中加載(使用LoadControl)的母版頁設置。我典型的頁面設置將是:Viewstate Disabled - 下拉框不返回值

Main.master -> Default.aspx -> ControlWrapper.ascx -> MyControl.ascx

我已經把的EnableViewState = 「假」 在我的Default.aspx頁。現在,當我嘗試從DropDownList in MyControl.ascx中讀取一個值時,它會在表單發佈時返回空白。首先,這是爲什麼?我以爲我應該仍然可以從下拉列表中讀取值?

然後我嘗試啓用該控件上的ViewState,它不起作用。

我也嘗試啓用Page_Init事件MyControl.ascx使用Page.EnableViewState = True;視圖狀態,但這也沒有幫助。

我想我有些誤解了viewstate,請問有人能指點我嗎?

p.s我不知道這些信息是否相關,但我在Page_Load事件中動態添加DropDownList的內容。 (想想看,這可能是問題 - 現在就測試一下)。

謝謝。

回答

1

我將假設您使用.NET 4.視圖狀態是ASP.NET頁面框架用於在往返之間保留頁面和控件值的方法。

當View State關閉時,它不起作用的原因是因爲當您執行PostBack到服務器時該控件再次呈現,這意味着您丟失了選定的值。

它不爲你工作時,視圖狀態是關閉網頁,但對控制的原因是爲了使這種工作,following conditions must be met

  • EnableViewState屬性爲頁面設置爲true。
  • 該控件的EnableViewState屬性設置爲true。
  • 控件的ViewStateMode屬性設置爲「已啓用」或繼承「已啓用」設置。

ASP .NET View State Overview

+0

好吧,我使用.NET 2.0(不好意思忘了OP的說),這是否讓任何點有什麼區別? – webnoob 2011-04-11 14:49:40

+0

如果我沒有記錯,不應該有所作爲。 ASP.NET 4只是爲您提供了一些管理ViewState的選項。你還是會需要它開啓自己的網頁和控制,如果你希望能夠找回您的下拉列表中選擇的值。如果我是你,我會默認打開它,並在有意義的地方有選擇地關閉它。如果您有性能問題,還可以使用其他方法,例如將ViewState保存到數據庫。 – BrandonZeider 2011-04-11 15:06:43

+0

如何將它保存到數據庫的工作?你可以爲此推薦任何文章嗎? – webnoob 2011-04-11 15:20:32

0

當你在頁面上做過EnableViewState = false;那麼你不應該在回發後期待DropdownList.SelectedValue

如果您在特定控件上啓用/禁用ViewState而不是通過在頁面指令中指定禁用整個視圖狀態,那將會很好。

+0

我同意這將是更好,但我有幾百控制的,其中大部分並不需要啓用它。這就是爲什麼我想停用並啓用我需要的功能。 – webnoob 2011-04-11 14:48:39

2

隨着ViewState的關閉,要裝載在Page_Load中的值是在列表中不再當你回來後(直到你顯然重新加載)。如果您想在沒有視圖狀態的情況下工作,您需要從Request.Form中的值中設置所選項目。

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    ddlItems.Items.Add(new ListItem("test1", "test1")); 
    ddlItems.Items.Add(new ListItem("test2", "test2")); 
    ddlItems.Items.Add(new ListItem("test3", "test3")); 

    if (Page.IsPostBack) 
     ddlItems.SelectedValue = Request.Form["ddlItems"]; 
} 
2

當你設置的ViewState爲false下拉需要頁面加載之前得到填充 - 這意味着你應該在頁面初始化做到這一點。事情是這樣的:

protected void Page_Init(object sender, System.EventArgs e) 
{ 
    ddlItems.Items.Add(new ListItem("test1", "test1")); 
    ddlItems.Items.Add(new ListItem("test2", "test2")); 
    ddlItems.Items.Add(new ListItem("test3", "test3")); 
} 

那麼你應該能夠在加載讀取值:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    someTextBox = ddlItems.SelectedValue; 
} 

背景的位:

在此頁面:Microsofts page cycle

在具有頁面循環的圖像中,在Init和Load之間有方法「ProcessPostData」和「LoadPostData」觸發。對於下降的數據後下包含選定值 - 但不是可能的值,所以當它加載後的數據至關重要的是,可能的值是已經存在(或者它不能夠集中選定的值)。在發佈數據加載之前,還沒有設置選定的值。

如果視圖狀態啓用它保存在回發之間檢索可能值。