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

находится в контроллере, когда я добираюсь до самой страницы I выходногоЗачем нужно = ViewData [""] показать строку, но оценить ее для той же строки не удается?

<%=ViewData["ShowPasswordHints"]%> в тег заголовка, и я могу видеть его там написано «True» (без кавычек, я также проверил для пространств окружая его скобкой и нет пространства буквально только True)

Однако, когда я

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

ШОУ не появляется это никогда, что, черт возьми?

ОБНОВЛЕНИЕ: Однако, если ViewData установлен так: ЭТО РАБОТАЕТ ... HUH ??

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

вид ...

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

БЛАГОДАРЯ КАЖДЫЙ ЗДЕСЬ НОВЫЙ МЕТОД, КОТОРЫЙ ОТЛИЧНО

ViewData["something"] = true; 

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

ответ

9

С ViewData является IDictionary<string, object>, ViewData["ShowPasswordHints"] имеет тип object. По умолчанию object s сравниваются по ссылке. Вы хотите сравнить значения. Таким образом, попробуйте приведения его к string, что повлечет за собой сравнение значений:

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

Больше на msdn.

UPDATE: Значение, которое вы положили в ViewData["ShowPasswordHints"], всегда является строкой. Однако, поскольку C# статически типизирован, компилятор не знает, что когда вы его возвращаете, это строка - он знает только, что это будет объект, так как ViewData - это IDictionary<string, object> (словарь, возвращающий простые объекты) , Но, поскольку вы знаете лучше, вы можете направить его на string, который, как вы знаете, должен быть. (Кстати, я думаю, ViewData это один из самых слабых точек рамок MVC, по этой причине и другим)

Почему это работает в <title> потому, что <%= %> теги называют ToString() на то, что в них. Поскольку ViewData["ShowPasswordHints"] - это строка, она выводится так, как вы ожидаете - строка ToString() - это сама строка.

И наконец: почему вы не используете логическое значение?

+2

Возможно, лучший (более безопасный) подход будет «True» .Equals (ViewData ["ShowPasswordHints"]). Нет ClassCastException, если объект в словаре данных представления не является строкой. – cdhowie 2010-12-06 20:57:00