为什么if有时只工作?

时间:2015-04-07 20:17:23

标签: c# razor model-view-controller

我的项目中有这个代码用于检查控制器和我的.cshtml文件中的操作:

@if (ViewContext.RouteData.Values["controller"] == "Home" && ViewContext.RouteData.Values["action"] == "Index")
{
    //Some html
}

当我在根目录(http://localhost/)打开页面时,它会显示给定的html。但是当我用完整的链接(http://localhost/Home/Index)打开它时,它没有显示出来。

当把变量放在网页的html中时,它们完全一样。

为什么这不起作用?

2 个答案:

答案 0 :(得分:2)

答案

使用.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上的任何方法之前解析了基础类型。并且比较将是内容而不是引用相等,因为基础类型是StringSee MSDN

小提琴

以下是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>

答案 1 :(得分:0)

我建议像null那样将其还原为

@if ("Home".Equals(ViewContext.RouteData.Values["controller"]) && "Index".Equals(ViewContext.RouteData.Values["action"]))
{
    //Some html
}