我想檢查我的登錄嘗試是否不超過3個,我指的是以下條件
if (((int)Session["LoginAttempt"]) != 3)
{
}
在登錄失敗條件我做增量象下面這樣:
Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;
但它給我錯誤「對象引用不設置到對象的實例。」
請建議!
我想檢查我的登錄嘗試是否不超過3個,我指的是以下條件
if (((int)Session["LoginAttempt"]) != 3)
{
}
在登錄失敗條件我做增量象下面這樣:
Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;
但它給我錯誤「對象引用不設置到對象的實例。」
請建議!
對不起你們,
我只是改變了整數轉換代碼
((int) Session["LoginAttempt"])
到
Convert.ToInt32(Session["LoginAttempt"]) + 1;
,現在它爲我工作正常,請建議櫃面的它的任何問題。
謝謝!
您需要測試以確定Session
變量是否存在,然後才能使用它並分配給它。
在這裏,你正在做的增量:
Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;
但是,如果Session["LoginAttempt"]
不存在,這將解釋你的錯誤。增量前快速null
測試應該整理出來。
if (Session["LoginAttempt"] != null)
Session["LoginAttempt"] = ((int)Session["LoginAttempt"]) + 1;
在嘗試檢索和/或增加它之前,您是否在某種程度上初始化它?
把你的平凡的代碼部分:
int sessionLogicAttempt = (int)Session["LoginAttempt"];
int someValue = sessionLogicAttempt + 1;
Session["LoginAttempt"] = someValue;
此外,添加斷言檢查你假設值。
如果您以前沒有初始化它,它會在您第一次嘗試設置它時執行此操作。試試這個:
if (Session["LoginAttempt"] == null)
Session["LoginAttempt"] = 1;
else
((int)Session["LoginAttempt"]) += 1;
//read
object attemptObj = Session["LoginAttempt"]
int attempt = 0;
if (attemptObj != null) attempt = (int)attemptObj ;
////write
Session["LoginAttempt"] = attempt++;
嘗試魔碼:
Session["LoginAttempt"] = ((int?)Session["LoginAttempt"] ?? 0) + 1;
這將會話變量Session["LoginAttempt"]
轉換爲可空int
(一int
,可以是null
)的?? 0
提供一個值如果它爲空則爲0,所以計算成功。
如果以前未初始化,則Session["LoginAttempt"]
可以爲null。
請確保不要投射可能爲空值的東西。
int i = Session["val"] == null ? 0 : (int)Session["val"];
儘管如果某些其他程序員使用「val」會話並在其中放置了一個非int值,也可能會讓您感到困惑。
int y = 0;
if (int.TryParse(Session["val"] == null ? string.Empty : Session["val"].ToString(), out y))
{
// got your int value
}
else
{
// no int value in session val
}
爲什麼不封裝LoginAttempt值作爲一個屬性,自動分配一個值:
protected int LoginAttempt
{
get
{
if (Session["LoginAttempt"] == null)
{
Session["LoginAttempt"] = 1;
}
return Convert.ToInt32(Session["LoginAttempt"].ToString());
}
set
{
Session["LoginAttempt"] = value;
}
}
這樣函數的主體是更具可讀性:
if (LoginAttempt < 3)
{
}