2010-05-05 11 views
5

Necesito inicializar un valor en un Javascript usando un literal C# que haga referencia a una variable de sesión. Estoy utilizando el siguiente códigoInicializando un valor a través de una variable de sesión

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

Sin embargo el código anterior es que me da un error clásico Object reference not set to an instance of an object.. ¿Por qué? ¿No debería (Session["myIndex"]).Equals(null) capturar este error en particular?

+2

Sesión [ "MyIndex"] devuelve un valor nulo y nulo no tiene una función .equals(). Necesita comparar con ==, ya que esa no es una función que necesita un objeto para derivar. – Corey

Respuesta

0

Esto funcionará (he probado!):

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

¿Estás seguro de que Session["myIndex"] no es nulo?

Debe agregar otro cortocircuito O comprobar (Session["myIndex"] == null) y deshacerse de (Session["myIndex"]).Equals(null).

1

error de referencia de objeto puede ser porque (Session [ "MyIndex"]) es nulo,

(Session [ "MyIndex"]). Iguales es utilizado para comparar el valor para que pueda usarlo desea comparar como (Session ["myIndex"]). Equals ("yourIndex")

-3

en el código detrás de crear una variable protegida e inicializarla allí. La principal ventaja es que puedes depurarlo allí. Y en plus puedes usar try catch.

de código subyacente

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

javascript:

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

esta manera se puede evitar el accidente y hacer otra cosa si el sessionValue es nula o tiene un defaultValue.

+2

-1 No usaría try/catch como sustituto de un simple * if (Session ["key"] == null) * check .... espero que no use ese método con demasiada frecuencia? – slugster

+0

La idea detrás de try catch es que puedes evitar un crash, y si cada vez que expira la sesión obtienes un colapso. Incluso si no tengo tanta experiencia, creo que esta es la forma más segura de hacerlo. Si puede evitar un bloqueo haciendo una simple comprobación, está bien, pero si hay la menor posibilidad de que la aplicación se bloquee, sugiero la versión de captura de prueba más segura – GxG

+2

No, la página no se bloqueará si la sesión expira - simplemente obtienes una nueva sesión sin nada en ella. Quédese con el cheque * if null * y nunca asuma que su artículo ha sido colocado correctamente en Session. – slugster

3

El problema es que null no es un objeto, y el método Equals() solo se puede usar en objetos. Si desea verificar si su objeto Session es nulo, debe usar (Session["myIndex"] == null). También puede usar string.IsNullOrEmpty() para una verificación adicional en cadenas vacías. En ese caso, el código debe ser:

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

Nota: no Session["backgroundIndex"] En caso de ser Session["myIndex"] en este caso? De lo contrario, la verificación de cadena nula o vacía es un poco inútil en mi opinión.

+0

-1 para ti también ... no puedes simplemente hacer * string.IsNullOrEmpty (Session ["myIndex"]) * - ni siquiera compilará como * Session [key] * devuelve un objeto, no una cadena. Tu explicación fue buena sin embargo. – slugster

+0

@slugster: en el contexto de la muestra, está claro que 'Session [" myIndex "]' es una cadena. Si se trata de un objeto diferente, entonces es mejor dejar lanzar la excepción, porque no lo está esperando. Además, la muestra proporcionada tampoco comprueba cadenas. – Prutswonder

+0

Acepto que la muestra no comprueba las cadenas (ni las emite) tampoco. No importa qué se mantenga en ese índice en particular, se devuelve como tipo * objeto *. En el momento en que voté negativamente hubo 4 respuestas, la tuya fue la mejor pero con errores sintácticos. Si editas la publicación, revertiré mi voto negativo. – slugster

Cuestiones relacionadas