【问题标题】:Getting controller name from razor从剃刀获取控制器名称
【发布时间】:2014-10-17 00:03:55
【问题描述】:

我似乎很难得到本应容易的东西。在我看来,使用 Razor,我想获取当前控制器的名称。例如,如果我在这里:

http://www.example.com/MyController/Index

如何从 Razor 表达式中获取控制器名称 MyController

@* Obviously this next line doesn't work
    @Controller.Name
*@

我是 MVC 新手,所以如果这是一个显而易见的答案,请不要攻击我。

【问题讨论】:

  • 查看这篇帖子stackoverflow.com/questions/6852979/…。不过对你的用例很好奇..
  • @Chandu - 我的网站有一个导航菜单,我使用常量 List 在 razor 中动态构建,并使用 @@foreach 遍历该列表中的每个项目以输出菜单项目。在构建菜单时,我希望它将一个名为“selected”的类应用于我所在的当前页面。例如,如果我在“www.example.com/Home/Index”上并且遇到“Home”菜单项,我希望它应用该类。如果有帮助,我可以发布代码。

标签: c# asp.net-mvc razor asp.net-mvc-5


【解决方案1】:
@{ 
    var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();
}

@{ 
    var controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}

【讨论】:

    【解决方案2】:

    Koti Panga 回答的附录:他提供的两个示例等效。

    这将返回处理执行此代码的视图的控制器的名称:

    var handlingController = this.ViewContext.RouteData.Values["controller"].ToString();
    

    这将返回 URL 中请求的控制器的名称:

    var requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
    

    虽然在大多数情况下这些肯定是相同的,但在某些情况下,您可能位于属于不同控制器的局部视图中,并且想要获取链中“更高”的控制器名称,在在这种情况下需要第二种方法。

    例如,假设您有一个部分视图负责呈现网站的菜单链接。因此,对于您网站中的每个页面,链接都已准备好并从 LayoutController 中名为 SiteMenuPartial 的操作传递到视图。

    所以当你加载/Home/Index时,布局页面被检索,布局页面调用SiteMenuPartial方法,返回SiteMenuPartial.cshtml局部视图。如果在该局部视图中,您要执行以下两行代码,它们将返回显示的值:

    /* Executes at the top of SiteMenuPartial.cshtml */
    @{
        // returns "Layout"
        string handlingController = this.ViewContext.RouteData.Values["controller"].ToString();
    
        // returns "Home"
        string requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
    }
    

    【讨论】:

      【解决方案3】:
      @HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
      

      MVC 3

      @ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
      

      MVC 4.5 或 MVC 5

      @ViewContext.RouteData.Values["controller"].ToString();
      

      【讨论】:

        【解决方案4】:

        要消除对ToString() 调用的需要

        @ViewContext.RouteData.GetRequiredString("controller")
        

        【讨论】:

          【解决方案5】:

          此外,如果您想获得完整的控制器名称(以“Controller”结尾),您可以使用:

          ViewContext.Controller.GetType().Name
          

          【讨论】:

            【解决方案6】:

            @ViewContext.RouteData.Values["controller"].ToString();

            【讨论】:

            • 您从 Sathish 的回答中复制并粘贴了它,不是吗?
            猜你喜欢
            • 2018-12-16
            • 1970-01-01
            • 1970-01-01
            • 2020-12-19
            • 1970-01-01
            • 2013-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多