C# 为什么=ViewData[";]会显示一个字符串,但对同一个字符串求值失败?
在控制器中,当我到达页面本身时,我输出C# 为什么=ViewData[";]会显示一个字符串,但对同一个字符串求值失败?,c#,asp.net-mvc,viewdata,C#,Asp.net Mvc,Viewdata,在控制器中,当我到达页面本身时,我输出 插入title标签,我可以看到它上面写着“True”(没有引号,我也用括号检查了空格,没有空格,它只是True) 但是当我这样做的时候 //CHECK IF WE SHOULD SHOW THE PASSWORD HINT OR NOT Setting passwordhints; using (var db = new dbDataContext()) { passwordhints = (from c in db.Settings
插入title标签,我可以看到它上面写着“True”(没有引号,我也用括号检查了空格,没有空格,它只是True)
但是当我这样做的时候
//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
查看
if (accountRepository.isLDAPEnabled(_ID))
ViewData["LDAP"] = "True";
else
ViewData["LDAP"] = "False";
展示这个
谢谢大家,这里有一个新方法非常有效
<%if(ViewData["LDAP"] == "True"){ %>
SHOW THIS
<%} %>
ViewData[“某物”]=true;
展示这个
由于ViewData
是一个IDictionary
,ViewData[“showPasswordHits”]
属于对象类型。默认情况下,对象
s通过引用进行比较。您需要一个值比较。因此,尝试将其强制转换为字符串
,这将导致值比较:
ViewData["something"] = true;
<%if(true.Equals(ViewData["something"])){%> SHOW THIS <%}%>
显示这个
更多关于
更新:您输入到ViewData[“showPasswordHits”]
中的值始终是字符串。然而,由于C#是静态类型的,编译器不知道当你把它取出来时,它是一个字符串——它只知道它将是一个对象,因为ViewData
是一个IDictionary
(返回普通对象的字典)。但是,既然您知道得更好,您可以将它转换为您知道它应该是的字符串。(顺便说一句,出于这个原因和其他原因,我认为ViewData是MVC框架最薄弱的环节之一)
这在
中起作用的原因是
标记调用ToString()
。由于ViewData[“showPasswordHits”]
是一个字符串,因此它的结果与您所期望的一样--ToString()
是字符串本身
最后:为什么不使用布尔值?也许更好(更安全)的方法是“True”.Equals(ViewData[“ShowPasswordHits”])
。如果视图数据字典中的对象不是字符串,则无ClassCastException。如果您解释了在第一个案例中引用对象时自动发生这种情况的原因,即标题标记,也会有所帮助。请参阅我的更新,为什么有时会起作用?当我试着说“True”而不是=obj.Value时,它仍然不起作用,但我上面添加的代码起作用了,我对此感到非常困扰:(@shogun更新中的代码只起作用,因为你很幸运:你在两个位置都使用常量字符串“True”
,所以引用比较起作用(作为常量,它们占用相同的内存位置)。数据库中的一个内存地址不同,因此引用比较失败。但我要再说一遍:为什么不使用布尔值?这种类型非常适合这种计算。@Kevingesner,噢..快照,谢谢!:)
ViewData["something"] = true;
<%if(true.Equals(ViewData["something"])){%> SHOW THIS <%}%>
<%if((string)ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%>