正在从剃须刀中获取控制器名称

本文关键字:控制器 获取 剃须刀 | 更新日期: 2023-09-27 18:26:46

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

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

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

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

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

正在从剃须刀中获取控制器名称

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

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

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

要删除对ToString()调用的需要,请使用

@ViewContext.RouteData.GetRequiredString("controller")

如果您想获得完整的控制器名称(以"controller"结尾),您可以使用:

ViewContext.Controller.GetType().Name

我想在前面的答案中添加更多信息。也许有人需要。

为了在剃刀视图引擎中找到Area NameController NameAction Name,您可以使用:

@{
    var areaName = ViewContext.RouteData.Values["area"].ToString();
    var controllerName = ViewContext.RouteData.Values["controller"].ToString();
    var actionName = ViewContext.RouteData.Values["action"].ToString();
}

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