2009-12-21 74 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