我如何返回ASP.NET MVC视图中的当前操作?

我想在我的母版页中设置一个CSS类,这取决于当前的控制器和操作。 我可以通过ViewContext.Controller.GetType().Name来获取当前的控制器,但是如何获得当前的操作(例如IndexShow等)呢?

使用ViewContext并查看RouteData集合以提取控制器和操作元素。 但我认为设置一些指示应用程序上下文的数据variables(例如,“editmode”或“error”)而不是控制器/动作会减less视图和控制器之间的耦合。

在RC中,您还可以像这样提取路由数据,如动作方法名称

 ViewContext.Controller.ValueProvider["action"].RawValue ViewContext.Controller.ValueProvider["controller"].RawValue ViewContext.Controller.ValueProvider["id"].RawValue 

更新MVC 3

 ViewContext.Controller.ValueProvider.GetValue("action").RawValue ViewContext.Controller.ValueProvider.GetValue("controller").RawValue ViewContext.Controller.ValueProvider.GetValue("id").RawValue 

更新MVC 4

 ViewContext.Controller.RouteData.Values["action"] ViewContext.Controller.RouteData.Values["controller"] ViewContext.Controller.RouteData.Values["id"] 

更新MVC 4.5

 ViewContext.RouteData.Values["action"] ViewContext.RouteData.Values["controller"] ViewContext.RouteData.Values["id"] 

在视图上获取当前的ID:

 ViewContext.RouteData.Values["id"].ToString() 

要获得当前控制器:

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

我知道这是一个较老的问题,但是我看到了它,而且我认为你可能会对另一个版本感兴趣,而不是让你的视图处理检索它所需要的数据。

我认为更简单的方法是重写OnActionExecuting方法。 您传递了包含ActionDescriptor成员的ActionExecutingContext ,您可以使用该成员获取您正在查找的信息,即ActionName,您也可以访问ControllerDescriptor并包含ControllerName。

 protected override void OnActionExecuting(ActionExecutingContext filterContext) { ActionDescriptor actionDescriptor = filterContext.ActionDescriptor; string actionName = actionDescriptor.ActionName; string controllerName = actionDescriptor.ControllerDescriptor.ControllerName; // Now that you have the values, set them somewhere and pass them down with your ViewModel // This will keep your view cleaner and the controller will take care of everything that the view needs to do it's job. } 

希望这可以帮助。 如果有的话,至less它会显示一个替代你的问题的其他人。

我看到了不同的答案,并提出了一个class级帮手:

 using System; using System.Web.Mvc; namespace MyMvcApp.Helpers { public class LocationHelper { public static bool IsCurrentControllerAndAction(string controllerName, string actionName, ViewContext viewContext) { bool result = false; string normalizedControllerName = controllerName.EndsWith("Controller") ? controllerName : String.Format("{0}Controller", controllerName); if(viewContext == null) return false; if(String.IsNullOrEmpty(actionName)) return false; if (viewContext.Controller.GetType().Name.Equals(normalizedControllerName, StringComparison.InvariantCultureIgnoreCase) && viewContext.Controller.ValueProvider.GetValue("action").AttemptedValue.Equals(actionName, StringComparison.InvariantCultureIgnoreCase)) { result = true; } return result; } } } 

所以在View(或者master / layout)中,你可以像这样使用它(Razor语法):

  <div id="menucontainer"> <ul id="menu"> <li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home", "index", ViewContext)) { @:class="selected" }>@Html.ActionLink("Home", "Index", "Home")</li> <li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("account","logon", ViewContext)) { @:class="selected" }>@Html.ActionLink("Logon", "Logon", "Account")</li> <li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home","about", ViewContext)) { @:class="selected" }>@Html.ActionLink("About", "About", "Home")</li> </ul> </div> 

希望能帮助到你。

您可以从ViewContext的RouteData中获取这些数据

 ViewContext.RouteData.Values["controller"] ViewContext.RouteData.Values["action"] 

在MVC中,您应该为View提供所有数据,而不是让View收集自己的数据,所以您可以在控制器操作中设置CSS类。

 ViewData["CssClass"] = "bold"; 

并从视图中的ViewData中挑出这个值

我投这个2:

 string currentActionName = ViewContext.RouteData.GetRequiredString("action"); 

 string currentViewName = ((WebFormView)ViewContext.View).ViewPath; 

您可以检索当前视图的实际名称和触发它的操作。 它可以在部分* .acmx页面中用来确定主机容器。

我正在使用ASP.NET MVC 4,这对我有用:

 ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue ControllerContext.Controller.ValueProvider.GetValue("action").RawValue 

扩展Dale Ragan的答案 ,他的重用的例子,创build一个派生自Controller的ApplicationController类,然后让所有其他控制器派生自该ApplicationController类而不是Controller。

例:

 public class MyCustomApplicationController : Controller {} public class HomeController : MyCustomApplicationController {} 

在你的新的ApplicationController上用这个签名创build一个名为ExecutingAction的属性:

 protected ActionDescriptor ExecutingAction { get; set; } 

然后在OnActionExecuting方法(来自Dale Ragan的回答)中,只需将ActionDescriptor分配给此属性,并且您可以在任何控制器中随时访问它。

 string currentActionName = this.ExecutingAction.ActionName; 

在您的控制器中覆盖此function

 protected override void HandleUnknownAction(string actionName) { TempData["actionName"] = actionName; View("urViewName").ExecuteResult(this.ControllerContext); }