从 Razor 中获取控制器名称

67

我似乎很难做到一件应该很容易的事情。从我的视角来看,使用Razor,我想获取当前控制器的名称。例如,如果我在这里:

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

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

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

我对MVC不太熟悉,如果这是一个显而易见的答案,请不要攻击我。


1
检查此帖子https://dev59.com/xWw15IYBdhLWcg3wD3jp。不过,我对您的用例很好奇。 - Chandu
@Chandu - 我的网站有一个导航菜单,我正在使用Razor动态构建它,使用一个常量List<T>并通过@@foreach迭代该列表中的每个项目,以输出菜单项。在构建菜单时,我希望它将一个名为"selected"的类应用于当前所在的页面。例如,如果我在"www.example.com/Home/Index"上,并且遇到了"Home"菜单项,我希望它应用这个类。如果需要,我可以发布代码。 - Icemanind
7个回答

118
@{ 
    var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();
}

或者

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

47

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();
}

18
@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();

5
为了避免调用 ToString() ,可以使用以下方法:
@ViewContext.RouteData.GetRequiredString("controller")

4

我想给之前的回答添加一些信息。也许有人需要。

为了在 Razor 视图引擎中找到 区域名称控制器名称操作名称,你可以使用:

@{
    var areaName = ViewContext.RouteData.Values["area"].ToString();

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

    var actionName = ViewContext.RouteData.Values["action"].ToString();
}

2

如果您想获取完整的控制器名称(以“Controller”结尾),可以使用以下方法:

ViewContext.Controller.GetType().Name

-6

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接