2010-05-05 11 views
5

Potrzebuję zainicjować wartość w kodzie JavaScript, używając literału C# odwołującego się do zmiennej sesji. Używam następujący kodInicjowanie wartości za pomocą zmiennej sesji

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

Jednakże powyższy kod daje mi klasyczny Object reference not set to an instance of an object. błąd. Czemu? Czy nie powinno się uchwycić tego konkretnego błędu?

+2

Session [ "myIndex"] zwraca null, a wartość null nie posiada funkcję .equals(). Musisz porównać z ==, ponieważ nie jest to funkcja, z której obiekt musi pochodzić. – Corey

Odpowiedz

0

To będzie działać (ja testowałem to!):

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

Czy na pewno Session["myIndex"] nie jest null?

Powinieneś dodać kolejne zwarcie LUB sprawdzić pod kątem (Session["myIndex"] == null) i pozbyć się (Session["myIndex"]).Equals(null).

1

błąd odwołanie do obiektu może być spowodowane (Session [ „myIndex”]) jest nieważna,

(Session [ „myIndex”]). Równa używana jest do porównywania wartości, dzięki czemu można używać go chcesz porównać jak (Sesja ["myIndex"]) .Poprawia ("twójIndeks")

-3

w kodzie za tworzoną zmienną i zainicjuj ją tam. Główną zaletą jest to, że można tam debugować. A dodatkowo możesz użyć metody catch catch.

kodu za

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

javascript:

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

W ten sposób można uniknąć katastrofy i zrobić coś innego, jeśli sessionValue jest null lub ma DefaultValue.

+2

-1 Nie używałbym try/catch jako zamiennika prostego * if (Session ["key"] == null) * check .... mam nadzieję, że nie używasz tej metody zbyt często? – slugster

+0

Ideą try catch jest to, że możesz uniknąć awarii, jeśli za każdym razem, gdy sesja wygaśnie, dostaniesz awarię. Nawet jeśli nie jestem tak doświadczony, uważam, że jest to najbezpieczniejszy sposób na zrobienie tego. Jeśli możesz uniknąć awarii, wykonując proste sprawdzenie, to jest w porządku, ale jeśli istnieje najmniejsza szansa, że ​​aplikacja może się zawiesić sugeruję bezpieczniejszą próbę złap wersję – GxG

+2

Nie, strona nie zawiedzie się, jeśli sesja wygaśnie - po prostu dostajesz nową sesję bez niczego. Trzymaj się kontroli * jeśli null * i nigdy nie zakładaj, że przedmiot został poprawnie umieszczony w Sesji. – slugster

3

Problem polega na tym, że null nie jest obiektem, a metoda Equals() może być używana tylko na obiektach. Jeśli chcesz sprawdzić, czy obiekt Session ma wartość NULL, powinieneś użyć (Session["myIndex"] == null). Możesz także użyć string.IsNullOrEmpty() dla dodatkowego sprawdzenia pustych ciągów. W tym przypadku kod powinien być:

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

Uwaga: nie Session["backgroundIndex"] Powinny być Session["myIndex"] w tym przypadku? W przeciwnym razie puste lub puste sprawdzanie ciągów jest moim zdaniem bezużyteczne.

+0

-1 dla ciebie też ... nie możesz po prostu zrobić * string.IsNullOrEmpty (Session ["myIndex"]) * - nie skompiluje się nawet jako * Session [key] * zwraca obiekt, a nie ciąg znaków. Twoje wyjaśnienie było jednak dobre. – slugster

+0

@slugster: Z kontekstu próbki wynika, że ​​'Session [" myIndex "]' jest ciągiem znaków. Jeśli jest to inny obiekt, możesz równie dobrze dać wyjątek, ponieważ nie spodziewasz się go. Poza tym dostarczona próbka również nie sprawdza ciągów. – Prutswonder

+0

Zgadzam się, że próbka nie sprawdza również ciągów (ani nie przesyłają do). Nie ma znaczenia, co jest przechowywane w tym konkretnym indeksie, jest zwracane jako typ * obiekt *. W momencie, gdy byłem w złej cenie, były 4 odpowiedzi, twoje było najlepsze, ale z błędami składniowymi. Jeśli edytujesz wpis, odwrócę moje zgłoszenie. – slugster

Powiązane problemy