it-swarm.com.de

Controller und Aktionsnamen aus dem Controller holen?

Für unsere Webanwendung muss ich die Reihenfolge der abgerufenen und angezeigten Elemente in Abhängigkeit von der Ansicht - oder genauer gesagt - der Steuerung und Aktion, die die Ansicht generiert hat (und natürlich der Benutzer-ID, aber darum geht es hier nicht) speichern.

Anstatt in jeder Controller-Aktion selbst einen Bezeichner anzugeben (um ihn für eine ansichtsabhängige Sortierung der DB-Ausgaben zu verwenden), hielt ich es für sicherer und einfacher, diesen Bezeichner automatisch aus dem Controller und der Aktionsmethode zu erstellen, die er erhält angerufen von.

Wie kann ich den Namen des Controllers und der Aktion aus der Aktionsmethode in einem Controller abrufen? Oder brauche ich dafür Reflexion? Ich denke, es ist ziemlich einfach, danke im Voraus!

160
Robert
string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
326
Andrei

Hier sind einige Erweiterungsmethoden zum Abrufen dieser Informationen (einschließlich der 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;
    }
}

Verwendungszweck:

@Html.Controller();
@Html.Action();
@Html.Id();
57
John Bubriski

Könnte nützlich sein. Ich brauchte die Aktion im Konstruktor des Controllers, und an diesem Punkt des MVC-Lebenszyklus wurde this nicht initialisiert und ControllerContext = null. Anstatt in den MVC-Lebenszyklus einzutauchen und den geeigneten Funktionsnamen zum Überschreiben zu finden, habe ich die Aktion im RequestContext.RouteData.

Um dies zu tun, müssen Sie jedoch wie bei allen HttpContext -bezogenen Verwendungen im Konstruktor den vollständigen Namespace angeben, da this.HttpContext wurde ebenfalls nicht initialisiert. Zum Glück scheint es System.Web.HttpContext.Current ist statisch.

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

ANMERKUNG: Wahrscheinlich nicht die am besten unterstützte Methode, um auf alle Eigenschaften in HttpContext zuzugreifen, aber für RequestContext und Session scheint es in meiner Anwendung gut zu funktionieren.

24
sonjz
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();
    }
}
10
Chris Ballance

Das habe ich bisher:

var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
4
user3563149
 @this.ViewContext.RouteData.Values["controller"].ToString();
3

Sie können den Namen des Controllers oder der Aktion wie jede Variable aus der Aktion abrufen. Sie sind nur spezielle (Controller und Aktion) und bereits definiert, so dass Sie nichts Besonderes tun müssen, um sie zu erhalten, außer Ich sage dir, du brauchst sie.

public string Index(string controller,string action)
   {
     var names=string.Format("Controller : {0}, Action: {1}",controller,action);
     return names;
   }

Sie können aber auch Controller und Aktionen in Ihre Modelle einbeziehen, um zwei davon und Ihre benutzerdefinierten Daten abzurufen.

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

Verwenden Sie die angegebenen Zeilen in OnActionExecuting for Action und den Namen des Controllers.

zeichenfolge actionName = this.ControllerContext.RouteData.Values ​​["action"]. ToString ();

zeichenfolge controllerName = this.ControllerContext.RouteData.Values ​​["controller"]. ToString ();

1
Bilal Raj

Dies scheint für mich (soweit) gut zu funktionieren, funktioniert auch, wenn Sie Attribut-Routing verwenden.

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");
    }
}
1
joepour

Hier ist die einfachste und praktischste Antwort, um einen Namen zu bekommen:

var actionName = RouteData.Values["controller"];
var controllerName = RouteData.Values["action"];

Oder

string actionName = RouteData.Values["controller"].ToString();
string controllerName = RouteData.Values["action"].ToString();

Code über Tests mit asp.net MVC 5.

1
Matheus Miranda

Um die Notwendigkeit eines ToString() -Aufrufs zu beseitigen, verwenden Sie

string actionName = ControllerContext.RouteData.GetRequiredString("action");
string controllerName = ControllerContext.RouteData.GetRequiredString("controller");
0

Fügen Sie dies Ihrem Basis-Controller in der GetDefaults () -Methode hinzu

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         GetDefaults();
         base.OnActionExecuting(filterContext);
    }

    private void GetDefaults()
    {
    var actionName = filterContext.ActionDescriptor.ActionName;
    var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    }

Implementieren Sie Ihre Controller zu Basecontroller

Fügen Sie eine Teilansicht _Breadcrumb.cshtml hinzu und fügen Sie sie auf allen erforderlichen Seiten mit @ Html.Partial ("_Breadcrumb") hinzu.

_ Breadcrumb.cshtml

<span>
    <a href="../@ViewData["controllerName"]">
        @ViewData["controllerName"]
    </a> > @ViewData["actionName"]
</span>
0
Kurkula