从剃刀获取控制器名称

Ice*_*ind 44 c# asp.net-mvc razor asp.net-mvc-5

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

http://www.example.com/MyController/Index
Run Code Online (Sandbox Code Playgroud)

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

@* Obviously this next line doesn't work
    @Controller.Name
*@
Run Code Online (Sandbox Code Playgroud)

我是MVC的新手,所以如果这是一个明显的答案,请不要攻击我.

Kot*_*nga 79

@{ 
    var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();
}
Run Code Online (Sandbox Code Playgroud)

要么

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


Ext*_*rey 38

Koti Panga答案的附录:他提供的两个例子并不等同.

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

var handlingController = this.ViewContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)

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

var requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)

虽然在大多数情况下这些肯定是相同的,但在某些情况下,您可能位于属于不同控制器的局部视图内,并且希望在链中获得控制器的名称"更高级",在这种情况下,第二种方法是必需的.

例如,假设您有一个部分视图负责呈现网站的菜单链接.所以,在你的网站的每个页面,链接准备,并通过从称为操作视图SiteMenuPartialLayoutController.

因此,当您加载时/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();
}
Run Code Online (Sandbox Code Playgroud)


小智 7

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)

MVC 3

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Run Code Online (Sandbox Code Playgroud)

MVC 4.5

@ViewContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)


Vad*_*kov 5

消除ToString()呼叫使用的需要

@ViewContext.RouteData.GetRequiredString("controller")
Run Code Online (Sandbox Code Playgroud)