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

在控制器中,当我到达页面本身时,我输出

<%=ViewData["ShowPasswordHints"]%>进入标题标签,我可以在上面看到它说“真”(不带引号,我还用括号括起来检查空格,没有空格,它实际上就是真)

但是,当我这样做时

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

SHOW THIS 永远不会出现,这到底是什么?

更新:但是,如果 ViewData 是这样设置的……它可以工作……嗯??

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

1 回答 1

10

既然ViewData是一个IDictionary<string, object>ViewData["ShowPasswordHints"]就是类型object。默认情况下,objects 通过引用进行比较。你想要一个价值比较。因此,尝试将其强制转换为 a string,这将导致值比较:

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

更多在msdn

更新:您输入的值ViewData["ShowPasswordHints"]始终是一个字符串。但是,由于 C# 是静态类型的,编译器不知道当您将其取出时,它是一个字符串——它只知道它将是一个对象,因为ViewData它是一个IDictionary<string, object>(返回普通对象的字典)。但既然你知道得更好,你可以把它投射到string你知道它应该是的那个。(顺便说一句,我认为 ViewData 是 MVC 框架的最弱点之一,出于这个原因和其他原因)

为什么这在其中起作用<title>是因为<%= %>标签调用ToString()其中的任何内容。既然ViewData["ShowPasswordHints"]是一个字符串,它就会像你所期望ToString()的那样出现——字符串就是字符串本身。

最后:你为什么不使用布尔值?

于 2010-12-06T20:55:26.890 回答