为什么= ViewData [""]会显示一个字符串但是对同一个字符串进行评估会失败?

Met*_*uru 5 c# asp.net-mvc viewdata

//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
Run Code Online (Sandbox Code Playgroud)

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

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

但是,当我这样做

<%if(ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%>
Run Code Online (Sandbox Code Playgroud)

显示这从未出现过,到底是什么?

更新:但是,如果ViewData设置如此......它工作......嗯?

if (accountRepository.isLDAPEnabled(_ID))
                ViewData["LDAP"] = "True";
            else
                ViewData["LDAP"] = "False";
Run Code Online (Sandbox Code Playgroud)

视图...

<%if(ViewData["LDAP"] == "True"){ %>
           SHOW THIS
         <%} %>
Run Code Online (Sandbox Code Playgroud)

感谢每个人,这里是工作伟大的新方法

ViewData["something"] = true;

<%if(true.Equals(ViewData["something"])){%> SHOW THIS <%}%>
Run Code Online (Sandbox Code Playgroud)

kev*_*ner 9

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

<%if((string)ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%>
Run Code Online (Sandbox Code Playgroud)

更多在msdn.

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

为什么这样做<title>是因为<%= %>标签会调用ToString()它们中的任何内容.因为它ViewData["ShowPasswordHints"]是一个字符串,它会像你期望的那样出现 - ToString()字符串就是字符串本身.

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

  • 也许更好(更安全)的方法是"真".Equals(ViewData ["ShowPasswordHints"])`.如果视图数据字典中的对象不是字符串,则不显示ClassCastException. (2认同)