2009-12-21 73 views
2

我創建了一個自定義服務器控件,用於處理一些數據,將該數據存儲到ViewState,然後從該數據中呈現自己。我使用調試器,可以實際看到的數據越來越設定的ViewState:ASP.NET自定義服務器控件不會持久ViewState

public string RawData 
    { 
     get 
     { 
      string result = null; 

      if (ViewState["RawData"] != null) 
      { 
       result = ViewState["RawData"].ToString(); 
      } 

      return result;     
     } 
     set 
     { 
      ViewState["RawData"] = value; 
     } 
    } 

然而,經過回發的ViewState值不保留,並且它爲空。這是爲什麼發生?我在哪裏可以嘗試排除故障?我可以看出,自從使用這種方法以來,ViewState隱藏字段的長度已經增加了。

在此先感謝!

編輯: 這裏是我的Render方法,看看我設置的ViewState:錯誤的

protected override void Render(HtmlTextWriter writer) 
    { 
     if (this.RawData == null) 
     { 
      StringBuilder content = new StringBuilder(); 

      content.Append(this.BuildHeader()); 
      content.Append(this.BuildLevelsMarkup()); 
      content.Append(this.BuildFooter()); 

      this.RawData = content.ToString(); 
     } 

     writer.Write(this.RawData); 
    } 

回答

8

一個可能的來源是,如果你在的OnInit事件過程中設置視圖狀態值。 ViewState僅在調用「TrackViewState」後才存儲。 http://msdn.microsoft.com/en-us/library/ms972976.aspx

也許你是「提前」。或者,如果您在渲染過程中設置了數據,則「太晚了」。

編輯:你正在改變你的價值在「渲染」 - 這太遲了!在渲染過程中,ViewState已經寫入HTML流。嘗試將您的代碼移動到OnPreRender()

+0

我在Page_Load上加載我的數據。我在原始文章中添加了更多代碼,以便您可以查看我何時設置數據。 – 2009-12-21 18:29:22

+0

你的代碼表明你正在Render中執行它,正如Arthur正確指出的那樣太晚了。 – 2009-12-22 09:30:50

+0

感謝您的編輯......我忽略了這一事實。 OnPreRender()非常棒! – 2009-12-22 22:23:02