2010-12-06 19 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 

est dans le contrôleur, quand je suis à la page elle-même de sortie IPourquoi would = ViewData [""] afficherait une chaîne mais l'évaluer pour la même chaîne échoue?

<%=ViewData["ShowPasswordHints"]%> dans la balise titre et je peux le voir là-bas, il dit « True » (sans les guillemets, j'ai également vérifié pour les espaces par qui l'entoure avec parenthèses et il n'y a pas d'espace, il est littéralement vrai)

Cependant, quand je

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

MONTRER cE ne semble, ce que l'enfer?

MISE À JOUR: Cependant, si ViewData est défini comme ceci ... IL FONCTIONNE ... HUH ??

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

vue ...

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

MERCI TOUT LE MONDE, EST ICI NOUVELLE MÉTHODE QUI FONCTIONNE GRANDE

ViewData["something"] = true; 

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

Répondre

9

Depuis ViewData est un IDictionary<string, object>, ViewData["ShowPasswordHints"] est de type object. Par défaut, object s sont comparés par référence. Vous voulez une comparaison de valeur. Ainsi, essayez la coulée à un string, ce qui entraînera une comparaison de la valeur:

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

Plus sur msdn.

MISE À JOUR: La valeur que vous mettez dans ViewData["ShowPasswordHints"] est toujours une chaîne. Cependant, puisque C# est typé statiquement, le compilateur ne sait pas que lorsque vous le retirez, c'est une chaîne - il sait seulement que ce sera un objet, puisque ViewData est un IDictionary<string, object> (un dictionnaire renvoyant des objets simples) . Mais puisque vous le savez mieux, vous pouvez le lancer sur le string que vous savez qu'il devrait être. (BTW, je pense que ViewData est l'un des points les plus faibles du framework MVC, pour cette raison et d'autres)

Pourquoi cela fonctionne dans le <title> est parce que les <%= %> appellent balises ToString() sur tout ce qui en eux. Comme ViewData["ShowPasswordHints"] est une chaîne, elle sort comme vous l'attendez - ToString() d'une chaîne est la chaîne elle-même.

Enfin: pourquoi n'utilisez-vous pas un booléen?

+2

Peut-être qu'une meilleure approche (plus sûre) serait '" True ". Equals (ViewData [" ShowPasswordHints "])'. Non ClassCastException si l'objet dans le dictionnaire de données de vue n'est pas une chaîne. – cdhowie

+0

Il serait également utile si vous avez expliqué pourquoi cela se produit automatiquement lors du référencement de l'objet dans son premier cas, la balise de titre. – Sorpigal

+0

voir ma mise à jour, pourquoi ça marche parfois? Quand j'ai essayé de dire = "True" au lieu de = obj.Value cela ne fonctionnait toujours pas mais le code que j'ai ajouté ci-dessus a fonctionné, je suis tellement troublé par ceci :( – BigOmega