2010-12-06 12 views
5
//CHECK IF WE SHOULD SHOW THE PASSWORD HINT OR NOT 
Setting passwordhints; 

using (var db = new dbDataContext()) 
{ 
    passwordhints = (from c in db.Settings 
      where c.Name == "ShowPasswordHints" && c.ID == _ID 
      select c).FirstOrDefault(); 
} 

if (passwordhints != null) 
    //NOTE: .Value IS A STRING 
    ViewData["ShowPasswordHints"] = passwordhints.Value; 
else 
    ViewData["ShowPasswordHints"] = "False"; 

//END PASSWORD HINTS CHECK 

es en el controlador, cuando llegue a la propia página de salida I¿Por qué would = ViewData [""] mostrar una cadena pero la evaluación de la misma cadena falla?

<%=ViewData["ShowPasswordHints"]%> en la etiqueta del título y puedo ver que allí se dice "True" (sin comillas, yo también la inspección de espacios de rodeándola con paréntesis y no hay espacios que es, literalmente, sólo Verdadero)

sin embargo cuando hago

<%if(ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%> 

MOSTRAR parece que esto nunca, ¿qué diablos?

ACTUALIZACIÓN: Sin embargo, si ViewData se establece así ... FUNCIONA ... HUH ??

if (accountRepository.isLDAPEnabled(_ID)) 
       ViewData["LDAP"] = "True"; 
      else 
       ViewData["LDAP"] = "False"; 

vista ...

<%if(ViewData["LDAP"] == "True"){ %> 
      SHOW THIS 
     <%} %> 

Gracias a todos, aquí está nuevo método que funciona de maravilla

ViewData["something"] = true; 

<%if(true.Equals(ViewData["something"])){%> SHOW THIS <%}%> 

Respuesta

9

Desde ViewData es un IDictionary<string, object>, ViewData["ShowPasswordHints"] es de tipo object. Por defecto, object s se comparan por referencia. Quieres una comparación de valores. Por lo tanto, intenta transmitir a un string, lo que provocará una comparación de valores:

<%if((string)ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%> 

Más contenido en msdn.

ACTUALIZACIÓN: El valor que pone en ViewData["ShowPasswordHints"] es siempre una cadena. Sin embargo, como C# está tipado estáticamente, el compilador no sabe que cuando lo saca de nuevo, es una cadena; solo sabe que será un objeto, ya que ViewData es un IDictionary<string, object> (un diccionario que devuelve objetos simples) . Pero ya que lo sabes mejor, puedes convertirlo al string que sabes que debería ser. (Por cierto, creo que ViewData es uno de los puntos más débiles del marco MVC, por esta razón y otras)

Por qué esto funciona en el <title> se debe a que las etiquetas <%= %> llaman ToString() en lo que sea en ellos. Como ViewData["ShowPasswordHints"] es una cadena, sale como se esperaría: ToString() de una cadena es la cadena misma.

Finalmente: ¿por qué no estás usando un booleano?

+2

Quizás un mejor enfoque (más seguro) sería '" Verdadero ".Equals (ViewData [" ShowPasswordHints "])'. No ClassCastException si el objeto en el diccionario de datos de vista no es una cadena. – cdhowie

+0

También ayudaría si explicara por qué esto sucede automáticamente al hacer referencia al objeto en su primer caso, la etiqueta del título. – Sorpigal

+0

ver mi actualización, ¿por qué a veces funciona? Cuando traté de decir = "Verdadero" en lugar de = obj.Valor todavía no funcionaba, pero el código que agregué arriba funcionó, estoy tan preocupado por esto :( – BigOmega

Cuestiones relacionadas