¿Cómo puedo devolver la acción actual en una vista ASP.NET MVC?

Quería establecer una clase de CSS en mi página maestra, que depende del controlador y la acción actuales. Puedo acceder al controlador actual a través de ViewContext.Controller.GetType().Name , pero ¿cómo obtengo la acción actual (por ejemplo, Index , Show , etc.)?

Use ViewContext y mire la colección RouteData para extraer tanto el controlador como los elementos de acción. Pero creo que establecer una variable de datos que indique el contexto de la aplicación (por ejemplo, “modo de edición” o “error”) en lugar de controlador / acción reduce el acoplamiento entre sus vistas y controladores.

En el RC también puedes extraer datos de ruta como el nombre del método de acción como este

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

Actualización para MVC 3

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

Actualización para MVC 4

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

Actualización para MVC 4.5

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

Para obtener el Id actual en una vista:

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

Para obtener el controlador actual:

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

Sé que esta es una pregunta anterior, pero la vi y pensé que podría interesarte una versión alternativa que dejar que tu vista maneje la recuperación de los datos que necesita para hacer su trabajo.

Una forma más fácil en mi opinión sería anular el método OnActionExecuting . Se le pasa el ActionExecutingContext que contiene el miembro ActionDescriptor que puede usar para obtener la información que está buscando, que es el ActionName y también puede acceder al ControllerDescriptor y contiene el 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. } 

Espero que esto ayude. En todo caso, al menos mostrará una alternativa para cualquier otra persona que responda a su pregunta.

Vi diferentes respuestas y se me ocurrió un ayudante de clase:

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

Así que en View (o master / layout) puedes usarlo como tal (syntax Razor):

   

Espero eso ayude.

Puede obtener estos datos de RouteData de un ViewContext

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

En MVC, debe proporcionar la vista con todos los datos, no dejar que la vista recopile sus propios datos, de modo que lo que puede hacer es establecer la clase CSS en la acción de su controlador.

 ViewData["CssClass"] = "bold"; 

y elige este valor de tu ViewData en tu vista

Yo voto por este 2:

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

y

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

Puede recuperar tanto el nombre físico de la vista actual como la acción que lo activó. Puede ser útil en páginas * .acmx parciales para determinar el contenedor de host.

Estoy usando ASP.NET MVC 4, y esto funcionó para mí:

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

Ampliando la respuesta de Dale Ragan , su ejemplo de reutilización, cree una clase ApplicationController que se deriva de Controller y, a su vez, todos los otros controladores derivan de esa clase ApplicationController en lugar de Controller.

Ejemplo:

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

En su nuevo ApplicationController, cree una propiedad llamada ExecutingAction con esta firma:

 protected ActionDescriptor ExecutingAction { get; set; } 

Y luego, en el método OnActionExecuting (de la respuesta de Dale Ragan), simplemente asigne el ActionDescriptor a esta propiedad y podrá acceder a él siempre que lo necesite en cualquiera de sus controladores.

 string currentActionName = this.ExecutingAction.ActionName; 

Anula esta función en tu controlador

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