net - mvc c#
¿Cómo puedo devolver la acción actual en una vista MVC de ASP.NET? (11)
Anula esta función en tu controlador
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}
Quería establecer una clase 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.)?
En MVC, debe proporcionar a la Vista todos los datos, no permita que la Vista recopile sus propios datos, por lo que puede configurar la clase CSS en la acción de su controlador.
ViewData["CssClass"] = "bold";
y seleccione este valor de su ViewData en su vista
En el RC también puede 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"]
Estoy usando ASP.NET MVC 4, y esto funcionó para mí:
ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue
ControllerContext.Controller.ValueProvider.GetValue("action").RawValue
Extendiendo la respuesta de Dale Ragan , su ejemplo de reutilización, cree una clase ApplicationController que se derive de Controller y, a su vez, haga que todos sus otros controladores deriven de esa clase de 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 cuando lo necesite en cualquiera de sus controladores.
string currentActionName = this.ExecutingAction.ActionName;
Para obtener la identificación actual en una vista:
ViewContext.RouteData.Values["id"].ToString()
Para obtener el controlador actual:
ViewContext.RouteData.Values["controller"].ToString()
Puede obtener estos datos de RouteData de un ViewContext
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
Sé que esta es una pregunta antigua, pero la vi y pensé que podría interesarle una versión alternativa que dejar que su vista se ocupe de recuperar los datos que necesita para hacer su trabajo.
En mi opinión, una forma más fácil 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 ActionName y también puede acceder a 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.
Use ViewContext
y observe 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 los controladores.
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 Vista (o maestro / diseño) puede usarlo así (sintaxis de 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>
Espero eso ayude.
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.