我有一个奇怪的问题,涉及我们的 .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="假"
并没有发现任何实例。我不知道下一步该尝试什么?有没有人遇到过这个?