2010-05-05 28 views
5

我需要通過使用引用會話變量的c#文字來初始化Javascript中的值。我使用下面的代碼通過Session變量初始化一個值

<script type="text/javascript" language="javascript" > 
    var myIndex = <%= !((Session["myIndex"]).Equals(null)||(Session["myIndex"]).Equals("")) ? Session["backgroundIndex"] : "1" %>; 

但是上面的代碼是給我一個經典的Object reference not set to an instance of an object.錯誤。爲什麼? (Session["myIndex"]).Equals(null)是否不應該捕獲這個特定的錯誤?

+2

會議[ 「myIndex」]返回空,空不具有.Equals()函數。您需要與==進行比較,因爲這不是需要對象派生的函數。 – Corey 2010-05-05 10:22:45

回答

0

這將工作(我已經測試了!):

var myIndex = <%=!string.IsNullOrEmpty((string)Session["myIndex"]) ? Session["myIndex"] : "1" %> ; 
1

您確定Session["myIndex"]不爲null?

您應該添加另一個短路或檢查(Session["myIndex"] == null)並擺脫(Session["myIndex"]).Equals(null)

1

對象引用錯誤可能是因爲(會話[「myIndex」])爲空,

(會話[「myIndex」])。Equals已被用於比較值,所以你可以使用它,你要比較像(Session [「myIndex」])。等於(「yourIndex」)

-3

在後面的代碼中創建一個受保護的變量並在那裏初始化它。主要優點是你可以在那裏調試它。加上你可以使用try catch。

代碼隱藏

protected string sessionValue; 
private void Page_Load(...) 
{ 
try 
{ 
sessionValue = Session["key"].ToString(); 
} 
catch 
{ 
sessionValue = [defaultValue]; 
} 
} 

的javascript:

<script> 
var sessionValue = "<%= sessionValue %>"; 
</script> 

這樣就可避免碰撞和做別的事情,如果sessionValue爲空或有一個默認值。

+2

-1我不會使用try/catch來代替簡單的* if(Session [「key」] == null)* check ....我希望你不要經常使用這種方法? – slugster 2010-05-05 10:48:16

+0

try catch背後的想法是,您可以避免崩潰,如果每次會話過期,您都會遇到崩潰。即使我沒有那麼有經驗,我相信這是最安全的方式。 如果你可以通過做一個簡單的檢查來避免崩潰,那麼它是可以的,但是如果應用程序可能崩潰的可能性很小,我建議更安全的嘗試catch版本 – GxG 2010-05-05 11:08:40

+2

不能,如果會話過期,頁面不會崩潰 - 你只需要一個沒有任何內容的新會話。堅持* if null *檢查,並且永遠不要假設您的項目已被正確放置到Session中。 – slugster 2010-05-05 11:18:14

3

問題是null不是對象,並且Equals()方法只能用於對象。如果你想檢查你的會話對象是否爲空,你應該使用(Session["myIndex"] == null)。您還可以使用string.IsNullOrEmpty()對空串進行額外檢查。在這種情況下,你的代碼應該是:

var myIndex = <%= !string.IsNullOrEmpty((string)Session["myIndex"]) ? Session["backgroundIndex"] : "1" %>; 

注:不宜Session["backgroundIndex"]在這種情況下Session["myIndex"]?否則,在我看來,空字符串或空字符串檢查是無用的。

+0

-1對於你也...你不能只做一個* string.IsNullOrEmpty(Session [「myIndex」])* - 它甚至不會編譯爲* Session [key] *返回一個對象,而不是一個字符串。你的解釋雖然是好的。 – slugster 2010-05-05 10:53:53

+0

@slugster:從示例的上下文中可以明顯看出,Session [「myIndex」]是一個字符串。如果它是一個不同的對象,那麼你可能會拋出異常,因爲你並不期待它。此外,提供的示例也不檢查字符串。 – Prutswonder 2010-05-06 06:32:26

+0

我同意該示例不檢查(或投射到)字符串。無關緊要的索引是什麼,它作爲* object *類型返回。當時我低調的有4個答案,你是最好的,但有句法錯誤。如果你編輯帖子,我會扭轉我的downvote。 – slugster 2010-05-06 07:00:21