2012-02-20 47 views
3

如何禁用我的ASP.NET頁面中的viewstate以獲取大多數控件,但允許某些控件仍然使用ViewState?爲某些控件禁用ASP.NET視圖狀態但不是全部

我曾嘗試:

  • 在屬性更改EnableViewState=false
  • 使用<%@ Page Language="C#" EnableViewState="false" ... >頁面

的頂部,但如何啓用一些控件仍然允許視圖狀態?

我使用.NET 4

+2

你的問題是什麼?您已經列出了禁用ViewState的個別控件和整個頁面的方法... – 2012-02-20 18:33:38

回答

6

我找到了一種方法,但只能使用在.NET框架4.在頁面指令將這個:

<% ---- ViewStateMode="Disabled" %> 

,並使用這個是要保存ViewState中每個控件(例如):

<asp:DropDownList ID="comGrade" runat="server" ViewStateMode="Enabled"> 
</asp:DropDownList> 
1

聽起來像是了ControlState-工作:

http://msdn.microsoft.com/en-us/library/1whwt1k7.aspx

+0

無法關閉ControlState。所以你要確保控制的所有用途總是需要它。如果您無法完全控制該控件的使用情況,最好在可能的情況下將信息保存在ViewState中,這樣可以讓不想使用該信息的用戶關閉該信息。 – 2012-02-20 18:42:21

0

設置ViewStateModeDisabled在頁面上,而忽略EnableViewState。您可以將其設置爲啓用某些控件(默認爲Inherit)。

編輯(旁註,看評論太):

正如我們在評論中討論,文本框保留即使ViewState中被禁用自己的價值。這是真的,因爲它們是HTTP POST請求的元素。例如,標籤不會呈現給span標籤。

在下面的示例代碼中,有一個填充了隨機數的標籤。如果將ViewStateMode設置爲Enabled,則將最後一個請求中的隨機數寫入調試輸出窗口。如果您將ViewStateMode設置爲Disabled,則會寫入空字符串。 Label的狀態不保留:

<%@ Page Language="C#" 
    AutoEventWireup="true" 
    CodeBehind="Default.aspx.cs" 
    Inherits="WebApplication2.Default" 
    ViewStateMode="Disabled" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title></title> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
      <asp:TextBox runat="server" ID="textbox" Text="Default" /> 
      <asp:Label runat="server" ID="randomNumberLabel" /> 
      <asp:Button runat="server" Text="Click Me" /> 
     </form> 
    </body> 
</html> 

這是後面的代碼。一定要附加一個調試器:

namespace WebApplication2 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
     private readonly static Random rnd = new Random(); 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if(this.IsPostBack) 
       Debug.WriteLine(this.randomNumberLabel.Text); 

      this.randomNumberLabel.Text = rnd.Next(Int32.MaxValue).ToString(); 
     } 
    } 
} 

我希望我設法澄清了區別。

+0

我嘗試了您的解決方案,但是當我看到源代碼時,我再次看到視圖狀態,並且當我的頁面重新加載我的文本框時再次顯示值。 – 2012-02-20 18:40:17

+0

你說得對。我想這是Tim提到的控制狀態。但是,我不確定是否誠實。無論如何,文本框會保留文本,因爲它們是HTML表單元素。它們的內容直接發送回服務器,而不是裝入ViewState中。我寫了一些示例代碼,我將編輯我的答案。 – 2012-02-20 20:28:21

0

可以在應用程序,頁面或控件級別禁用ViewState。

要禁用在應用層面,把下列你的web.config文件:

<Pages EnableViewState="false" ... /> 

要禁用某個特定頁面,你這樣做聲明的頁面指令:

<%@ Page EnableViewState=」false」 

或以編程方式在頁面事件中:

private void Page_Init(object sender, System.EventArgs e) 
{ 
    this.EnableViewState = false; 
} 

最後,要禁用視圖狀態在特定的控件上,您可以使用以下內容:

<asp:datagrid EnableViewState="false" ... /> 

請記住,某些控件在viewstate關閉時無法正常工作。有時你可以保持ViewState爲特定控件啓用,但通過仔細確定ASP.Net事件管道中的哪個位置來填充控件,從而最小化視圖狀態有效負載的大小。你可以閱讀excellent reference瞭解更多信息。

+0

我嘗試所有這些,但我的控件在頁面重新加載後仍然有價值。 – 2012-02-20 18:43:28

4

ASP.NET 4允許對視圖狀態進行更多的控制。請參閱MSDN關於ViewStateMode屬性的文檔。還有關於SO Minimizing viewstate- confused by EnableViewState and ViewStateMode in asp.net 4.0的問題。

在v4之前的ASP.NET中,無論將子項設置爲EnableViewState="true",禁用ViewState都會禁用所有子項。在ASP.NET 4中,您可以通過以下MSDN文檔建議重新啓用了子:

要爲頁面禁用視圖狀態,並使其能夠在頁面上的特定 控制,設置的EnableViewState頁面和 財產的控制真正,頁面ViewStateMode屬性設置爲 殘疾人,控制的ViewStateMode屬性設置爲 啓用

+0

當我將頁面的ViewStateMode屬性設置爲禁用。我不能將該控件的ViewStateMode屬性設置爲啓用。當我將控件的ViewStateMode屬性設置爲Enabled時,我的控件在頁面回發後沒有值 – 2012-02-20 18:59:28

+0

@Mahdijokar:您是否在頁面和控件上設置了「EnableViewState = true」?如果是這樣,並且它在回發時還沒有填充,您是否可以提供控制源,以便我們確保在正確的頁面生命週期事件中保存/加載viewstate? – 2012-02-20 19:13:46

相關問題