这个错误不断出现,我似乎无法弄清楚它来自哪里。
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"];
答案 0 :(得分:1)
您没有检查会话中是否存在密钥"CartItemCount"
。如果它不存在,那么Session["CartItemCount"]
的结果将返回null并在尝试将null转换为(int)
时创建该错误。
答案 1 :(得分:1)
如果会话对象不存在,它将返回null,这将破坏转换。你应该考虑使用int.tryparse。如果成功,它将更新整数,否则它不会爆炸。
尝试以下代码
int LocalCartItemCount;
int.TryParse(Session["CartItemCount"].ToString(), out LocalCartItemCount);
计划b
int LocalCartItemCount = (int)(Session["CartItemCount"] ?? 0);
答案 2 :(得分:1)
嗯,第一个问题是Session["CartItemCount"]
很可能是空的。由于您尝试在演员表中使用此空值,因此您收到对象引用错误。
这可以通过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
}
或者,您可以使用上述??
运算符。