195 votes

Obtenir le nom du contrôleur et de l'action à partir du contrôleur?

Pour notre application web j'ai besoin pour économiser de l'ordre de l'extrait et affiche les éléments en fonction de la vue - ou, pour être précis - le contrôleur et l'action qui a généré la vue (et l'identifiant de l'utilisateur, bien sûr, mais ce n'est pas le point ici).

Au lieu de simplement donner un identificateur de moi-même dans chaque contrôleur de l'action (dans l'ordre d'utilisation dans la DB, UserSorting table), j'ai pensé qu'il serait plus sûr et plus facile à créer cet identifiant automatiquement à partir du contrôleur et une méthode d'action, elle est appelée à partir de.

Comment puis-je obtenir le nom du contrôleur et de l'action à partir de la méthode d'action dans un contrôleur? Ou ai-je besoin de réflexion pour qui? Je suppose que c'est assez facile, merci d'avance!

373voto

Andrei Points 25595
string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();

73voto

John Bubriski Points 5789

Voici quelques méthodes d'extension pour obtenir ces informations (cela inclut également l'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;
    }
}
 

Usage:

 @Html.Controller();
@Html.Action();
@Html.Id();
 

24voto

sonjz Points 926

Pourrait être utile. J'avais besoin de l'action dans le constructeur du contrôleur, et il apparaît à ce stade de la MVC du cycle de vie, this n'a pas initialisé, et ControllerContext = null. Au lieu de fouiller dans la MVC du cycle de vie et de trouver le nom de la fonction appropriée à remplacer, je viens de trouver à l'action dans l' RequestContext.RouteData.

Mais pour le faire, comme avec n'importe quel HttpContext dans le constructeur, vous devez spécifier l'espace de nom complet, car this.HttpContext n'a pas été initialisé. Heureusement, il semble System.Web.HttpContext est statique.

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

NOTE: probablement pas le plus de prise en charge pour accéder à toutes les propriétés de la HttpContext, mais pour RequestContext de Session et il semble fonctionner très bien dans mon application.

12voto

Chris Ballance Points 17329
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();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X