Почему = ViewData [""] показывает строку, но вычислить ее для той же строки не удалось? - PullRequest
5 голосов
/ 06 декабря 2010
//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

находится в контроллере, когда я попадаю на саму страницу, я вывожу

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

Однако, когда я делаю

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

ПОКАЗАТЬ, ЭТОГО никогда не появляется, какого черта?

ОБНОВЛЕНИЕ : Тем не менее, если ViewData настроен следующим образом ... ЭТО РАБОТАЕТ ... А? ?? 1014 *

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 <%}%>

1 Ответ

9 голосов
/ 06 декабря 2010

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

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

Еще при msdn .

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

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

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

...