c# - net - Obtener el nombre del controlador y la acción desde dentro del controlador?
route controller c# (13)
Use las líneas dadas en OnActionExecuting for Action y el nombre del controlador.
string actionName = this.ControllerContext.RouteData.Values ["action"]. ToString ();
string controllerName = this.ControllerContext.RouteData.Values ["controller"]. ToString ();
Para nuestra aplicación web, necesito guardar el orden de los elementos obtenidos y mostrados según la vista, o para ser precisos, del controlador y la acción que generó la vista (y la identificación del usuario, por supuesto, pero ese no es el punto aquí).
En lugar de solo dar un identificador en cada acción del controlador (para utilizarlo para una clasificación dependiente de la vista de las salidas DB), pensé que sería más seguro y más fácil crear este identificador automáticamente desde el controlador y el método de acción que obtiene llamado desde.
¿Cómo puedo obtener el nombre del controlador y la acción desde dentro del método de acción en un controlador? ¿O necesito reflexión para eso? ¡Creo que es bastante fácil, gracias de antemano!
Agregue esto a su controlador base dentro del método GetDefaults ()
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
GetDefaults();
base.OnActionExecuting(filterContext);
}
private void GetDefaults()
{
var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
}
Implemente sus controladores en Basecontroller
Agregue una vista parcial _Breadcrumb.cshtml y agréguela en todas las páginas requeridas con @ Html.Partial ("_ Breadcrumb")
_Breadcrumb.cshtml
<span>
<a href="../@ViewData["controllerName"]">
@ViewData["controllerName"]
</a> > @ViewData["actionName"]
</span>
Aquí hay algunos métodos de extensión para obtener esa información (también incluye la ID):
public static class HtmlRequestHelper
{
public static string Id(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("id"))
return (string)routeValues["id"];
else if (HttpContext.Current.Request.QueryString.AllKeys.Contains("id"))
return HttpContext.Current.Request.QueryString["id"];
return string.Empty;
}
public static string Controller(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("controller"))
return (string)routeValues["controller"];
return string.Empty;
}
public static string Action(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("action"))
return (string)routeValues["action"];
return string.Empty;
}
}
Uso:
@Html.Controller();
@Html.Action();
@Html.Id();
Esta es la respuesta más simple y práctica para obtener un nombre:
var actionName = RouteData.Values["controller"];
var controllerName = RouteData.Values["action"];
O
string actionName = RouteData.Values["controller"].ToString();
string controllerName = RouteData.Values["action"].ToString();
Código anterior prueba con asp.net mvc 5.
Esto es lo que tengo hasta ahora:
var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
Esto parece funcionar bien para mí (hasta ahora), también funciona si está utilizando el enrutamiento de atributos.
public class BaseController : Controller
{
protected string CurrentAction { get; private set; }
protected string CurrentController { get; private set; }
protected override void Initialize(RequestContext requestContext)
{
this.PopulateControllerActionInfo(requestContext);
}
private void PopulateControllerActionInfo(RequestContext requestContext)
{
RouteData routedata = requestContext.RouteData;
object routes;
if (routedata.Values.TryGetValue("MS_DirectRouteMatches", out routes))
{
routedata = (routes as List<RouteData>)?.FirstOrDefault();
}
if (routedata == null)
return;
Func<string, string> getValue = (s) =>
{
object o;
return routedata.Values.TryGetValue(s, out o) ? o.ToString() : String.Empty;
};
this.CurrentAction = getValue("action");
this.CurrentController = getValue("controller");
}
}
Para eliminar la necesidad de usar la llamada ToString()
string actionName = ControllerContext.RouteData.GetRequiredString("action");
string controllerName = ControllerContext.RouteData.GetRequiredString("controller");
Podría ser útil. Necesitaba la acción en el constructor del controlador, y aparece en este punto del ciclo de vida de MVC, this
no se ha inicializado, y ControllerContext = null
. En lugar de profundizar en el ciclo de vida de MVC y encontrar el nombre de función apropiado para reemplazar, acabo de encontrar la acción en RequestContext.RouteData
.
Pero para hacerlo, como con cualquier uso relacionado con HttpContext
en el constructor, debe especificar el espacio de nombres completo, porque this.HttpContext
tampoco se ha inicializado. Afortunadamente, parece que System.Web.HttpContext.Current
es estático.
// controller constructor
public MyController() {
// grab action from RequestContext
string action = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action");
// grab session (another example of using System.Web.HttpContext static reference)
string sessionTest = System.Web.HttpContext.Current.Session["test"] as string
}
NOTA: probablemente no sea la forma más compatible para acceder a todas las propiedades en HttpContext, pero para RequestContext y Session parece funcionar bien en mi aplicación.
Puede obtener el nombre del controlador o el nombre de acción de la acción como cualquier variable. Son simplemente especiales (controlador y acción) y ya están definidos, por lo que no es necesario hacer nada especial para obtenerlos, excepto decirle que los necesita.
public string Index(string controller,string action)
{
var names=string.Format("Controller : {0}, Action: {1}",controller,action);
return names;
}
O puede incluir controlador, acción en sus modelos para obtener dos de ellos y sus datos personalizados.
public class DtoModel
{
public string Action { get; set; }
public string Controller { get; set; }
public string Name { get; set; }
}
public string Index(DtoModel baseModel)
{
var names=string.Format("Controller : {0}, Action: {1}",baseModel.Controller,baseModel.Action);
return names;
}
@this.ViewContext.RouteData.Values["controller"].ToString();
string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues != null)
{
if (routeValues.ContainsKey("action"))
{
var actionName = routeValues["action"].ToString();
}
if (routeValues.ContainsKey("controller"))
{
var controllerName = routeValues["controller"].ToString();
}
}