【问题标题】:Why does the if work only sometimes?为什么 if 有时只工作?
【发布时间】:2015-04-07 20:17:22
【问题描述】:

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

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

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

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

那为什么不行呢?

【问题讨论】:

  • 调试可能是找出这个问题的最简单方法...设置断点并检查值...

标签: c# razor model-view-controller


【解决方案1】:

回答

使用.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>

【讨论】:

    【解决方案2】:

    我建议像这样还原它,以防为空

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      相关资源
      最近更新 更多