为什么 if 有时只起作用?
Why does the if work only sometimes?
我的项目中有这段代码,用于检查我的 .cshtml- 文件中的控制器和操作:
@if (ViewContext.RouteData.Values["controller"] == "Home" && ViewContext.RouteData.Values["action"] == "Index")
{
//Some html
}
当我在根 (http://localhost/), it shows the given html. But when I open it with the full link (http://localhost/Home/Index) 打开页面时,它没有显示。
把变量放在网页html里,完全一样
为什么这不起作用?
回答
使用 .Equals("")
而不是 ==
。
解释
ViewContext.RouteData.Values["controller"]
是 object
类型。如果要检查内容的相等性,首先需要将底层类型解析为String
。如果您使用 ==
,则 C# 在进行比较之前不会解析基础类型。当您使用 Equals()
时,C# 会首先解析基础类型。这就是 C# 需要知道基础类型的原因。
当您使用 ==
运算符并且其中一个操作数是 object
时,检查是为了引用相等性。在您的问题中,基础类型是 String
并不重要,因为 C# 不检查基础类型。如果它确实检查了底层类型,那么 ==
会起作用,但它不起作用。它只是检查两个引用是否相同。 See MSDN.
如果您真的想使用 ==
,那么您可以明确告诉 C# 使用 string
比较。
ViewContext.RouteData.Values["controller"].ToString()
(ViewContext.RouteData.Values["controller"] as string)
((string)ViewContext.RouteData.Values["controller"])
最好只使用 Equals(string)
方法。 C# 会自行判断您正在使用 String
。换句话说,基础类型是 String
确实很重要,因为 C# 在调用 object
上的任何方法之前解析基础类型。并且比较将针对内容而不是引用相等性,因为基础类型是 String
。 See MSDN.
Fiddle
这是a Fiddle给你的。
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
@ViewContext.RouteData.Values["controller"]
@ViewContext.RouteData.Values["action"]
@if (ViewContext.RouteData.Values["controller"].Equals("Home")
&& ViewContext.RouteData.Values["action"].Equals("Index"))
{
<p>True</p>
}
else
{
<p>False</p>
}
@if (ViewContext.RouteData.Values["controller"] == "Home"
&& ViewContext.RouteData.Values["action"] == "Index")
{
<p>True</p>
}
else
{
<p>False</p>
}
</body>
</html>
我建议像这样恢复它,以防空
@if ("Home".Equals(ViewContext.RouteData.Values["controller"]) && "Index".Equals(ViewContext.RouteData.Values["action"]))
{
//Some html
}
我的项目中有这段代码,用于检查我的 .cshtml- 文件中的控制器和操作:
@if (ViewContext.RouteData.Values["controller"] == "Home" && ViewContext.RouteData.Values["action"] == "Index")
{
//Some html
}
当我在根 (http://localhost/), it shows the given html. But when I open it with the full link (http://localhost/Home/Index) 打开页面时,它没有显示。
把变量放在网页html里,完全一样
为什么这不起作用?
回答
使用 .Equals("")
而不是 ==
。
解释
ViewContext.RouteData.Values["controller"]
是 object
类型。如果要检查内容的相等性,首先需要将底层类型解析为String
。如果您使用 ==
,则 C# 在进行比较之前不会解析基础类型。当您使用 Equals()
时,C# 会首先解析基础类型。这就是 C# 需要知道基础类型的原因。
当您使用 ==
运算符并且其中一个操作数是 object
时,检查是为了引用相等性。在您的问题中,基础类型是 String
并不重要,因为 C# 不检查基础类型。如果它确实检查了底层类型,那么 ==
会起作用,但它不起作用。它只是检查两个引用是否相同。 See MSDN.
如果您真的想使用 ==
,那么您可以明确告诉 C# 使用 string
比较。
ViewContext.RouteData.Values["controller"].ToString()
(ViewContext.RouteData.Values["controller"] as string)
((string)ViewContext.RouteData.Values["controller"])
最好只使用 Equals(string)
方法。 C# 会自行判断您正在使用 String
。换句话说,基础类型是 String
确实很重要,因为 C# 在调用 object
上的任何方法之前解析基础类型。并且比较将针对内容而不是引用相等性,因为基础类型是 String
。 See MSDN.
Fiddle
这是a Fiddle给你的。
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
@ViewContext.RouteData.Values["controller"]
@ViewContext.RouteData.Values["action"]
@if (ViewContext.RouteData.Values["controller"].Equals("Home")
&& ViewContext.RouteData.Values["action"].Equals("Index"))
{
<p>True</p>
}
else
{
<p>False</p>
}
@if (ViewContext.RouteData.Values["controller"] == "Home"
&& ViewContext.RouteData.Values["action"] == "Index")
{
<p>True</p>
}
else
{
<p>False</p>
}
</body>
</html>
我建议像这样恢复它,以防空
@if ("Home".Equals(ViewContext.RouteData.Values["controller"]) && "Index".Equals(ViewContext.RouteData.Values["action"]))
{
//Some html
}