0

这个错误不断出现,我似乎无法弄清楚它来自哪里。

if (!IsPostBack)
{
    DataTable LocalCart = new DataTable();
    LocalCart = (DataTable)Session["cart"];
    int LocalCartItemCount = (int) Session["CartItemCount"];
    Decimal LocalCartAmount = (Decimal)Session["CartAmount"];

    if (LocalCart.Rows.Count == 0)
    {
        titleLabel.Text = "Your shopping cart is empty!";
        GridCart.Visible = false;
        updateButton.Enabled = false;
        checkoutButton.Enabled = false;
        totalAmountLabel.Text = String.Format("{0:c}", 0);
    }
    else
    {
        GridCart.DataSource = LocalCart;
        GridCart.DataBind();
        titleLabel.Text = "These are the products in your shopping cart:";
        GridCart.Visible = true;
        updateButton.Enabled = true;
        checkoutButton.Enabled = true;
        totalAmountLabel.Text = String.Format("{0:c}", LocalCartAmount);
    }

这是说错误在这里->int LocalCartItemCount = (int) Session["CartItemCount"];

4

3 回答 3

1

好吧,第一个问题Session["CartItemCount"]很可能是空的。由于您尝试在强制转换中使用此 null 值,因此您会收到对象引用错误。

这可以用 C# 的??运算符纠正:

int LocalCartItemCount = (int)(Session["CartItemCount"] ?? 0);

该行基本上是这个的简写:

int LocalCartItemCount;
if(Session["CartItemCount"] != null)
    LocalCartItemCount = Session["CartItemCount"];
else
    LocalCartItemCount = 0;

这应该有效,只要Session["CartItemCount"]它始终是一个整数。但是,如果它不是整数,您可能会收到以下错误之一:

  • Specified cast is not valid
  • Cannot unbox 'Session["CartItemCount"]' as 'int'

如果存在上述这些错误的风险,那么您可能必须将其扩展为如下内容:

int LocalCartItemCount = 0;
if (Session["CartItemCount"] != null) 
{
    Int32.TryParse(Session["CartItemCount"].ToString(), out LocalCartItemCount);
}

通常,虽然,我不喜欢TryParse在布尔表达式之外使用,但它仍然可以。

请记住,您需要对来自会话的任何对象进行类似的空检查。因此,LocalCart.Rows.Count == 0例如,对于评论中提到的支票,我会将其更改if为:

if(LocalCart != null && LocalCart.Rows.Count == 0)
{
    // do stuff here
}

或者,您可以使用上述??运算符。

于 2013-04-18T16:51:48.467 回答
1

您没有检查密钥是否"CartItemCount"存在于 Session 中。如果它不存在,则结果Session["CartItemCount"]将返回 null 并在尝试将 null 强制转换为(int).

于 2013-04-18T16:36:04.737 回答
1

如果会话对象不存在,它将返回 null,这将破坏强制转换。您应该考虑使用 int.tryparse。如果成功,它将更新整数,如果不成功,它将不会爆炸。

试试下面的代码

int LocalCartItemCount;
int.TryParse(Session["CartItemCount"].ToString(), out LocalCartItemCount);

b计划

int LocalCartItemCount = (int)(Session["CartItemCount"] ?? 0);
于 2013-04-18T16:36:22.443 回答