2017-03-09 69 views
0


我在我的項目中使用webform(在asp.net 4.5中)。 但有時,值的我的viewstate變量丟失。 它只出現在一天或一兩次。有時ViewState變量丟失值

我喜歡在onpreload一個代碼片段:

protected override void OnPreLoad(EventArgs e) 
    { 
     base.OnPreLoad(e); 

     if (!EnableViewState || Form == null) 
      return; 
     if (Session["postbackError"] != null) 
     { 
      Session["postbackError"] = null; 

      //write this error to log file 
      var ex = new Exception("Lost viewstate"); 
      LogErrorUltil.LogError(ex); 
     } 
     if (IsPostBack && Form.Attributes["postback"] == null) 
     { 
      Session["postbackError"] = true;    
     } 
     Form.Attributes["postback"] = "1"; 
    } 

我在日誌中看到,「失落的視圖狀態」的消息在日誌文件中寫入。
但我確信:
1. Web.config文件不刷新
2. IIS的應用程序池不回收。

你能否給我一個想法,可以讓「Lost viewstate」寫入日誌文件,除了上面的兩個原因?

我非常感謝你的想法。 感謝您的想法。

+0

ViewState和Session是兩個不同的東西。 – VDWWD

+0

是的,我知道ViewState和Session是兩個不同的東西。但正如你在我的代碼中看到的,我總是設置Form.Attributes [「postback」] =「1」。但是我不知道爲什麼有時候,Form.Attributes [「postback」]在PostBack中爲null – user3796752

回答

0

沒有必要在會話中保留錯誤消息,特別是如果將它們保存在日誌文件中。

的Web.config

Web.config不會刷新?

如果你修改你的web.config你需要重建你的應用程序,所以Form.Attributes["postback"]將是null

如果Web.config未刷新,則ViewState將保留Form.Attributes["postback"]值。無需爲每個事件OnPreLoad的呼叫設置其值。使用OnLoad事件,您可以設置ViewState需要注意的所有值。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(IsPostback) 
    { 
     return; 
    } 

    // Set here all the values that will be maintained by 'ViewState' 
    Form.Attributes.Add("postback", "1"); 
    TextBox1.BackColor = System.Drawing.Color.Wheat; 

    /* 
     Set runat="server" and enableviewstate="true" on common html elements 
     if you need to preserve it's values and styles between postbacks 
    */ 
} 
IIS的


應用程序池不回收

如果回收應用程序池您失去ViewState,如果沒有,ViewState堅持回發之間,當你請求另一個頁面丟失。


的EnableViewState = 「假」 OR ViewStateMode = 「已禁用」
您需要設置爲你做的Form.Attributes["postback"]屬性的值。

+0

謝謝你的回覆。 – user3796752

+0

是否有另一個可以使異常(「失蹤視圖狀態」)的原因;出現在我的日誌中,除了2個原因:
1.刷新web.config。
2. IIS的應用程序池被回收
。因爲如果出現這兩種情況,我將用戶重定向到登錄頁面,並且從未將異常寫入日誌文件。我認爲還有其他原因,比如用戶在點擊保存按鈕之前在窗體中保留很長時間。這是一個原因?感謝您的回覆。 – user3796752

+0

是的。在這篇文章中(https://www.iis.net/configreference/system.applicationhost/sites/sitedefaults/limits),您可以瞭解更多關於連接超時的信息。可能這篇文章有你正在尋找的東西。 –

0

首先,你在你的問題提的ViewState很多次,但你的代碼沒有使用ViewState的。相反,它使用SessionState

Form.Attributes["postback"] = "1";是名爲回傳添加屬性形式標籤。 <form ... postback="1">它不是ViewState。這個方法真的很奇怪。

Default SessionState timeout is 20 minutes.

這意味着,如果用戶20分鐘閒置後訪問服務器,SessionState的不再有效,它會返回null。

如果你想超過20分鐘,就可以提高它在web.config中

+0

我看到我的代碼沒有使用viewstate。我只是在我的代碼中創建一個示例,以獲取關於哪些事情可以使「Exception(」Lost viewstate「)」出現在我的代碼中的想法。會話超時不是我的問題的原因,因爲如果會話超時,我將用戶重定向到登錄頁面,然後再運行函數。 – user3796752