2011-06-09 75 views
1

所以我有一个列表框在我的页面和一些文本框。通过文本框我可以添加一个项目到我的列表框中(点击按钮,它将它添加到一个私人列表中,然后将其设置为ViewState,并且该列表再次是数据绑定)。我的列表框也位于按钮的Click事件触发的updatepanel中。问题:我的Viewstate在回发中保持为空,因此每次都会重置。Viewstate null on postback

一些代码:

private const string VIEW_INGREDIENTS = "IngredientsList"; 
     private const string VIEW_LANGUAGE = "CurrentLanguage"; 
     private List<IngredientData> _ingredientsList; 

protected void Page_PreInit(object sender, EventArgs e) 
     { 
      if (Page.IsPostBack) 
      { 
       if (ViewState[VIEW_INGREDIENTS] != null) 
       { 
        _ingredientsList = (List<IngredientData>) ViewState[VIEW_INGREDIENTS]; 
       } 

      } 
      else 
      { 
       // prepare ingredient lists 
       _ingredientsList = new List<IngredientData>(); 
      } 
     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 

      lstIngredients.DataSource = _ingredientsList; 
      lstIngredients.DataTextField = "Text"; 
      lstIngredients.DataValueField = "Name"; 
      lstIngredients.DataBind(); 
     } 

protected void btnAddIngredient_Click(object sender, EventArgs e) 
     { 
      _ingredientsList.Add(new IngredientData { Name = txtIngredientName.Text, Quantity = txtUnitQuantity.Text, Unit = lstUnits.SelectedValue }); 

      ViewState[VIEW_INGREDIENTS] = _ingredientsList; 
      lstIngredients.DataSource = _ingredientsList; 
      lstIngredients.DataBind(); 
     } 

回答

8

您在PreInit期间使用vewstate吗?尝试在PreLoad期间稍后检查。

+0

这似乎解决了它!谢谢! – Fverswijver 2011-06-09 10:02:24

+0

+1真棒,不敢相信我忽略了:D – Andomar 2011-06-09 10:24:22

+0

哇,很高兴知道 – Jim109 2015-11-16 18:44:14

4

检查网页中是否有EnableViewState="true"

<%@ Page Language="C#" EnableViewState="true" ... 

并验证web.config的站点范围设置:

<pages enableViewState="true" enableViewStateMac="true" ... /> 

现在ASP.NET有内置viewstate列表控件,所以我想知道为什么你要为它编写自定义代码。默认的viewstate应该适合你想要完成的工作。