页面控制在发回后丢失ViewState

时间:2013-08-22 16:25:17

标签: c# asp.net controls postback viewstate

我有一个奇怪的问题,我们的.aspx页面和页面上的控件在页面回发后会丢失ViewState数据。

这不是生产中的问题,但似乎只是在visual studio中本地运行的问题。

重现的步骤:

  • 我访问了一个产品页面,从下拉列表中选择了一个产品类型(这在生产中也很好,两个代码库都相同) - 下拉列表设置为AutoPostback
  • 然后我将产品添加到我的购物篮中 - 这涉及另一个回发
  • 此时单步执行代码我可以看到许多控件(例如下拉列表)的null属性都有SelectedItem

以下是相关代码段的一小部分示例。

填充产品类型下拉列表:

if (!Page.IsPostBack)
{
    Product product = ProductsDALC.FetchBySeoUrl(Request.QueryString["url"]);

    ddlOptions.DataSource = product.ActiveVariants;
    ddlOptions.DataBind();
    ddlOptions.Items.Insert(0, new ListItem("Please choose an option.", "-1"));

    pnlOptions.Visible = product.ActiveVariants.Count > 1;
}

将产品添加到购物篮中:

protected void btnAddToCart_Click(object sender, EventArgs e)
{
    Product product = ProductsDALC.FetchBySeoUrl(Request.QueryString["url"]);

    int quantity = 0;
    quantity = Convert.ToInt32(ddlQuantity.SelectedValue);

    if ((ddlOptions.SelectedValue != "-1" && !ddlOptions.SelectedValue.Contains("~NA")) || product.ActiveVariants.Count == 1)
    {
        int variantId = product.DefaultVariant.Id;
        if (product.ActiveVariants.Count > 1)
        {
            variantId = Helpers.CartHelper.GetVariantIdFromDDL(ddlOptions.SelectedValue);
        }

        if (quantity > 0)
        {
            if (product.ActiveVariants.VariantById(variantId).CanBeSold)
            {
                CartItem item = product.CartItem(product.ActiveVariants.VariantById(variantId));
                item.Thumbnail = product.Imaging.MainImage.Images.ByType("Thumbnail").HtmlUrl;
                item.SeoUrl = UrlHelper.Url(UrlHelper.PageType.Product, product, false);
                CartHelper.Add(item, quantity);
                this.Master.RebindBasketWithMessage();
            }
        }
     }
}

将项目添加到购物篮后,代码会跳过页面加载,因为它是回发,然后进入btnAddToCart_Click方法。在这里失败了:

Convert.ToInt32(ddlQuantity.SelectedValue);

检查我看到""的值。检查此控件的SelectedItem我可以看到它是null

相同的代码在这里失败:

Product p = ProductsDALC.FetchBySeoUrl(Request.QueryString["url"]);

foreach (var variant in p.Variants)
{
      if (ddlOptions.SelectedItem.Text.Contains(variant.Description))
      {
          if (variant.OutOfStockStatusId == 2 && variant.LiveStock && variant.StockLevel <= 0)
          {
               litStockStatus.Text = "<span class=\"in-stock\">Stock in 3-5 days</span>";
          }
          else
          {
               litStockStatus.Text = "<span class=\"in-stock\">In stock</span>";
          }
      }
}

当代码到达ddlOptions.SelectedItem时,抛出空引用异常,该异常也为空。这就好像控件在回发中失去状态但只在本地?

我已经搜索了解决方案,以防有人设置:

  

的EnableViewState = “假”

没有发现任何情况。我不知道下一步该尝试什么?有没有人遇到过这个?

0 个答案:

没有答案