Wie simuliere ich Server.Transfer in ASP.NET MVC?


124

In ASP.NET MVC können Sie ganz einfach ein umleitendes ActionResult zurückgeben:

 return RedirectToAction("Index");

 or

 return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });

Dies führt tatsächlich zu einer HTTP-Umleitung, was normalerweise in Ordnung ist. Bei Verwendung von Google Analytics führt dies jedoch zu großen Problemen, da der ursprüngliche Referer verloren geht und Google nicht weiß, woher Sie stammen. Dadurch gehen nützliche Informationen wie Suchmaschinenbegriffe verloren.

Nebenbei bemerkt hat diese Methode den Vorteil, dass alle Parameter entfernt werden, die möglicherweise aus Kampagnen stammen, aber ich kann sie dennoch serverseitig erfassen. Wenn Sie sie in der Abfragezeichenfolge belassen, werden Lesezeichen gesetzt oder Twitter oder Blog ein Link, den sie nicht sollten. Ich habe dies mehrmals gesehen, als Leute Links zu unserer Website mit Kampagnen-IDs getwittert haben.

Wie auch immer, ich schreibe einen "Gateway" -Controller für alle eingehenden Besuche auf der Site, den ich möglicherweise an verschiedene Orte oder alternative Versionen weiterleiten kann.

Im Moment interessiert mich Google vorerst mehr (als versehentliches Lesezeichen), und ich möchte in der Lage sein, jemanden zu senden, der /die Seite besucht , die er erhalten würde, wenn er zu /home/7dieser Version 7 einer Homepage gehen würde.

Wie ich bereits sagte Wenn ich dies tue, verliere ich die Fähigkeit von Google, den Referer zu analysieren:

 return RedirectToAction(new { controller = "home", version = 7 });

Was ich wirklich will, ist ein

 return ServerTransferAction(new { controller = "home", version = 7 });

Dadurch bekomme ich diese Ansicht ohne eine clientseitige Weiterleitung. Ich glaube nicht, dass so etwas existiert.

Derzeit ist das Beste, was ich mir einfallen lassen kann, die gesamte Controller-Logik HomeController.Index(..)in meiner GatewayController.IndexAktion zu duplizieren . Das heißt , ich musste umziehen 'Views/Home'in 'Shared'so war es zugänglich. Es muss einen besseren Weg geben ?? ..


Was genau ServerTransferActionwollten Sie replizieren? Ist das eine tatsächliche Sache? (konnte keine Informationen darüber finden ... danke für die Frage, übrigens, die Antwort unten ist hervorragend)
jleach

Suchen Sie nach Server.Transfer (...). Dies ist eine Möglichkeit, eine Umleitung auf der Serverseite durchzuführen, bei der der Client die umgeleitete Seite ohne clientseitige Umleitung empfängt. Im Allgemeinen wird es mit modernem Routing nicht empfohlen.
Simon_Weaver

1
"Übertragen" ist eine veraltete ASP.NET-Funktion, die in MVC nicht mehr erforderlich ist, da mithilfe des Routings direkt zur richtigen Controller-Aktion gewechselt werden kann. Siehe diese Antwort für Details.
NightOwl888

@ NightOwl888 ja definitiv - aber manchmal auch aufgrund der Geschäftslogik ist es notwendig / einfacher. Ich schaute zurück, um zu sehen, wo ich dies letztendlich verwendet hatte - (zum Glück nur an einer Stelle) -, wo ich eine Homepage hatte, die ich für bestimmte komplexe Bedingungen dynamisch sein wollte, und hinter den Kulissen zeigt sie eine andere Route. Ich möchte es auf jeden Fall so weit wie möglich zugunsten des Routings oder der Routenbedingungen vermeiden - aber manchmal ist eine einfache ifAussage einfach zu verlockend.
Simon_Weaver

@Simon_Weaver - Und was ist falsch an Unterklassen, RouteBasedamit Sie Ihre ifAnweisung dort platzieren können, anstatt alles nach hinten zu biegen, um von einem Controller zum anderen zu springen?
NightOwl888

Antworten:


130

Wie wäre es mit einer TransferResult-Klasse? (basierend auf Stans Antwort )

/// <summary>
/// Transfers execution to the supplied url.
/// </summary>
public class TransferResult : ActionResult
{
    public string Url { get; private set; }

    public TransferResult(string url)
    {
        this.Url = url;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var httpContext = HttpContext.Current;

        // MVC 3 running on IIS 7+
        if (HttpRuntime.UsingIntegratedPipeline)
        {
            httpContext.Server.TransferRequest(this.Url, true);
        }
        else
        {
            // Pre MVC 3
            httpContext.RewritePath(this.Url, false);

            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(httpContext);
        }
    }
}

Aktualisiert: Funktioniert jetzt mit MVC3 (unter Verwendung von Code aus Simons Beitrag ). Es sollte (konnte es nicht testen) auch in MVC2 funktionieren, indem geprüft wird, ob es in der integrierten Pipeline von IIS7 + ausgeführt wird oder nicht.

Für volle Transparenz; In unserer Produktionsumgebung haben wir das TransferResult nie direkt verwendet. Wir verwenden ein TransferToRouteResult, das wiederum das TransferResult ausführt. Folgendes läuft tatsächlich auf meinen Produktionsservern.

public class TransferToRouteResult : ActionResult
{
    public string RouteName { get;set; }
    public RouteValueDictionary RouteValues { get; set; }

    public TransferToRouteResult(RouteValueDictionary routeValues)
        : this(null, routeValues)
    {
    }

    public TransferToRouteResult(string routeName, RouteValueDictionary routeValues)
    {
        this.RouteName = routeName ?? string.Empty;
        this.RouteValues = routeValues ?? new RouteValueDictionary();
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var urlHelper = new UrlHelper(context.RequestContext);
        var url = urlHelper.RouteUrl(this.RouteName, this.RouteValues);

        var actualResult = new TransferResult(url);
        actualResult.ExecuteResult(context);
    }
}

Und wenn Sie T4MVC verwenden (wenn nicht ... tun!) , Kann diese Erweiterung nützlich sein.

public static class ControllerExtensions
{
    public static TransferToRouteResult TransferToAction(this Controller controller, ActionResult result)
    {
        return new TransferToRouteResult(result.GetRouteValueDictionary());
    }
}

Mit diesem kleinen Juwel können Sie tun

// in an action method
TransferToAction(MVC.Error.Index());

1
das funktioniert super. Achten Sie darauf, dass Sie nicht in eine Endlosschleife geraten - wie bei meinem ersten Versuch, indem Sie die falsche URL übergeben. Ich habe eine kleine Änderung vorgenommen, damit eine Routenwertsammlung übergeben werden kann, die für andere nützlich sein kann.
Gepostet

Update: Diese Lösung scheint gut zu funktionieren, und obwohl ich sie nur in sehr begrenzter Kapazität verwende, habe ich noch keine Probleme gefunden
Simon_Weaver

Ein Problem: Kann nicht von POST zu GET-Anfrage umleiten - aber das ist nicht unbedingt eine schlechte Sache. etwas, vor dem man vorsichtig sein sollte
Simon_Weaver

2
@BradLaney: Sie können einfach die Zeilen 'var urlHelper ...' und 'var url ...' entfernen und 'url' für den Rest durch 'this.Url' ersetzen, und es funktioniert. :)
Michael Ulmann

1
1: Kupplung / Einheitentest / zukünftige Kompatibilität. 2: MVC Core / MVC Samples verwenden diesen Singleton niemals. 3: Dieser Singleton ist in einem Thread (null) nicht verfügbar, weder in einem Pool-Thread noch in einem asynchronen Delegaten, der in einem anderen als dem Standardkontext aufgerufen wird, wie bei Verwendung asynchroner Aktionsmethoden. 4: Nur aus Kompatibilitätsgründen setzt mvc diesen Singleton-Wert auf context.HttpContext, bevor Benutzercode eingegeben wird.
Softlion

47

Bearbeiten: Aktualisiert, um mit ASP.NET MVC 3 kompatibel zu sein

Vorausgesetzt, Sie verwenden IIS7, scheint die folgende Änderung für ASP.NET MVC 3 zu funktionieren. Vielen Dank an @nitin und @andy für den Hinweis, dass der ursprüngliche Code nicht funktioniert hat.

Edit 4/11/2011: TempData bricht mit Server.TransferRequest ab MVC 3 RTM ab

Der folgende Code wurde geändert, um eine Ausnahme auszulösen - aber derzeit keine andere Lösung.


Hier ist meine Modifikation basierend auf Markus 'modifizierter Version von Stans ursprünglichem Beitrag. Ich habe einen zusätzlichen Konstruktor hinzugefügt, um ein Routenwertwörterbuch zu verwenden - und es in MVCTransferResult umbenannt, um Verwirrung zu vermeiden, dass es sich möglicherweise nur um eine Umleitung handelt.

Ich kann jetzt Folgendes für eine Umleitung tun:

return new MVCTransferResult(new {controller = "home", action = "something" });

Meine modifizierte Klasse:

public class MVCTransferResult : RedirectResult
{
    public MVCTransferResult(string url)
        : base(url)
    {
    }

    public MVCTransferResult(object routeValues):base(GetRouteURL(routeValues))
    {
    }

    private static string GetRouteURL(object routeValues)
    {
        UrlHelper url = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()), RouteTable.Routes);
        return url.RouteUrl(routeValues);
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var httpContext = HttpContext.Current;

        // ASP.NET MVC 3.0
        if (context.Controller.TempData != null && 
            context.Controller.TempData.Count() > 0)
        {
            throw new ApplicationException("TempData won't work with Server.TransferRequest!");
        }

        httpContext.Server.TransferRequest(Url, true); // change to false to pass query string parameters if you have already processed them

        // ASP.NET MVC 2.0
        //httpContext.RewritePath(Url, false);
        //IHttpHandler httpHandler = new MvcHttpHandler();
        //httpHandler.ProcessRequest(HttpContext.Current);
    }
}

1
Dies scheint in MVC 3 RC nicht zu funktionieren. Fehler bei HttpHandler.ProcessRequest (), heißt es: 'HttpContext.SetSessionStateBehavior' kann nur aufgerufen werden, bevor das Ereignis 'HttpApplication.AcquireRequestState' ausgelöst wird.
Andy

Ich hatte noch keine Änderung, um MVC3 anzusehen. Lassen Sie mich wissen, wenn Sie eine Lösung finden
Simon_Weaver

Tut Server.TransferRquest, wie von Nitin vorgeschlagen, das, was oben versucht wird?
Old Geezer

Warum müssen wir TempData auf null prüfen und> 0 zählen?
Yurart

Sie tun es nicht, aber es ist nur eine Sicherheitsfunktion. Wenn Sie es bereits verwenden und sich darauf verlassen, werden Sie sich nicht am Kopf kratzen, wenn es verschwindet
Simon_Weaver


12

Ich habe kürzlich herausgefunden, dass ASP.NET MVC Server.Transfer () nicht unterstützt, daher habe ich eine Stub-Methode erstellt (inspiriert von Default.aspx.cs).

    private void Transfer(string url)
    {
        // Create URI builder
        var uriBuilder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, Request.ApplicationPath);
        // Add destination URI
        uriBuilder.Path += url;
        // Because UriBuilder escapes URI decode before passing as an argument
        string path = Server.UrlDecode(uriBuilder.Uri.PathAndQuery);
        // Rewrite path
        HttpContext.Current.RewritePath(path, false);
        IHttpHandler httpHandler = new MvcHttpHandler();
        // Process request
        httpHandler.ProcessRequest(HttpContext.Current);
    }

9

Könnten Sie nicht einfach eine Instanz des Controllers erstellen, zu dem Sie umleiten möchten, die gewünschte Aktionsmethode aufrufen und dann das Ergebnis zurückgeben? Etwas wie:

 HomeController controller = new HomeController();
 return controller.Index();

4
Nein, auf dem von Ihnen erstellten Controller sind Dinge wie Request and Response nicht korrekt eingerichtet. Das kann zu Problemen führen.
Jeff Walker Code Ranger

Ich stimme @JeffWalkerCodeRanger zu: das gleiche auch nach dem Setzen der EigenschaftotherController.ControllerContext = this.ControllerContext;
T-Moty

7

Ich wollte die aktuelle Anforderung an einen anderen Controller / eine andere Aktion umleiten, während der Ausführungspfad genau so bleibt, als ob dieser zweite Controller / diese zweite Aktion angefordert worden wäre. In meinem Fall würde Server.Request nicht funktionieren, da ich weitere Daten hinzufügen wollte. Dies entspricht dem aktuellen Handler, der ein anderes HTTP-GET / POST ausführt und dann die Ergebnisse an den Client überträgt. Ich bin mir sicher, dass es bessere Möglichkeiten geben wird, dies zu erreichen, aber hier ist, was für mich funktioniert:

RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Public");
routeData.Values.Add("action", "ErrorInternal");
routeData.Values.Add("Exception", filterContext.Exception);

var context = new HttpContextWrapper(System.Web.HttpContext.Current);
var request = new RequestContext(context, routeData);

IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(filterContext.RequestContext, "Public");
controller.Execute(request);

Ihre Vermutung ist richtig: Ich habe diesen Code eingegeben

public class RedirectOnErrorAttribute : ActionFilterAttribute, IExceptionFilter

und ich verwende es, um Entwicklern Fehler anzuzeigen, während es in der Produktion eine regelmäßige Umleitung verwendet. Beachten Sie, dass ich keine ASP.NET-Sitzung, Datenbank oder andere Methoden zum Übergeben von Ausnahmedaten zwischen Anforderungen verwenden wollte.


7

Anstatt eine Serverübertragung zu simulieren, kann MVC weiterhin einen Server ausführen.TransferRequest :

public ActionResult Whatever()
{
    string url = //...
    Request.RequestContext.HttpContext.Server.TransferRequest(url);
    return Content("success");//Doesn't actually get returned
}

Fühlen Sie sich frei, Ihrer Antwort einen Text hinzuzufügen, um sie weiter zu erläutern.
Wladimir Palant

Beachten Sie, dass hierfür MVCv3 und höher erforderlich ist.
Seph

5

Instanzieren Sie einfach den anderen Controller und führen Sie seine Aktionsmethode aus.


Dies wird nicht die gewünschte URL in der Adressleiste
anzeigen

@ arserbin3 - Server.Transfer auch nicht. Diese Anforderung ist vermutlich der Grund, warum die ursprüngliche Frage überhaupt gestellt wurde.
Richard Szalay

2

Sie können den anderen Controller neu starten und die Aktionsmethode aufrufen, die das Ergebnis zurückgibt. Dazu müssen Sie Ihre Ansicht jedoch in den freigegebenen Ordner legen.

Ich bin mir nicht sicher, ob Sie dies mit Duplikat gemeint haben, aber:

return new HomeController().Index();

Bearbeiten

Eine andere Möglichkeit könnte darin bestehen, eine eigene ControllerFactory zu erstellen. Auf diese Weise können Sie bestimmen, welcher Controller erstellt werden soll.


Dies mag der Ansatz sein, aber es scheint nicht ganz den richtigen Kontext zu haben - selbst wenn ich hc.ControllerContext = this.ControllerContext sage. Außerdem sucht es dann unter ~ / Views / Gateway / 5.aspx nach der Ansicht und findet sie nicht.
Simon_Weaver

Außerdem verlieren Sie alle Aktionsfilter. Sie möchten wahrscheinlich versuchen, die Execute-Methode auf der IController-Schnittstelle zu verwenden, die Ihre Controller implementieren müssen. Zum Beispiel: ((IController) neuer HomeController ()). Ausführen (...). Auf diese Weise nehmen Sie weiterhin an der Action Invoker-Pipeline teil. Sie müssten jedoch genau herausfinden, was Sie an Execute übergeben müssen ... Reflector könnte dort helfen :)
Andrew Stanton-Nurse

Ja, ich mag die Idee, einen Controller neu zu entwickeln, nicht. Ich denke, Sie sollten besser Ihre eigene Controller-Fabrik definieren, die als der richtige Erweiterungspunkt dafür erscheint. Aber ich habe kaum die Oberfläche dieses Frameworks zerkratzt, so dass ich vielleicht weit weg bin.
JoshBerke

1

Kümmert sich das Routing nicht nur um dieses Szenario für Sie? Für das oben beschriebene Szenario können Sie einfach einen Routenhandler erstellen, der diese Logik implementiert.


Es basiert auf programmatischen Bedingungen. dh Kampagne 100 könnte zu Ansicht 7 gehen und Kampagne 200 könnte zu Ansicht 8 usw. usw. gehen, die für das Routing zu kompliziert sind
Simon_Weaver

4
Warum ist das für das Routing zu kompliziert? Was ist falsch an benutzerdefinierten Routenbeschränkungen? stephenwalther.com/blog/archive/2008/08/07/…
Ian Mercer

1

Für alle, die ausdrucksbasiertes Routing verwenden und nur die oben genannte TransferResult-Klasse verwenden, ist hier eine Controller-Erweiterungsmethode, die den Trick ausführt und TempData beibehält. TransferToRouteResult ist nicht erforderlich.

public static ActionResult TransferRequest<T>(this Controller controller, Expression<Action<T>> action)
    where T : Controller
{
     controller.TempData.Keep();
     controller.TempData.Save(controller.ControllerContext, controller.TempDataProvider);
     var url = LinkBuilder.BuildUrlFromExpression(controller.Request.RequestContext, RouteTable.Routes, action);
     return new TransferResult(url);
}

Warnung: Dies scheint einen Fehler zu verursachen: "Für die SessionStateTempDataProvider-Klasse muss der Sitzungsstatus aktiviert sein", obwohl dies tatsächlich noch funktioniert. Ich sehe diesen Fehler nur in meinen Protokollen. Ich benutze ELMAH für die Fehlerprotokollierung und erhalte diesen Fehler für InProc und AppFabric
Simon_Weaver

1

Server.TransferRequestist in MVC völlig unnötig . Dies ist eine veraltete Funktion, die nur in ASP.NET erforderlich war, da die Anforderung direkt auf eine Seite kam und es eine Möglichkeit geben musste, eine Anforderung auf eine andere Seite zu übertragen. Moderne Versionen von ASP.NET (einschließlich MVC) verfügen über eine Routing-Infrastruktur, die so angepasst werden kann, dass sie direkt an die gewünschte Ressource weitergeleitet wird. Es macht keinen Sinn, die Anforderung einen Controller erreichen zu lassen, nur um sie auf einen anderen Controller zu übertragen, wenn Sie die Anforderung einfach direkt an den Controller und die gewünschte Aktion senden können.

Da Sie auf die ursprüngliche Anfrage antworten, müssen Sie nichts in einen TempDataanderen Speicher stecken, um die Anfrage an den richtigen Ort weiterzuleiten. Stattdessen gelangen Sie mit intakter ursprünglicher Anforderung zur Controller-Aktion. Sie können auch sicher sein, dass Google diesen Ansatz gutheißt, da er vollständig auf der Serverseite erfolgt.

Während Sie mit beiden IRouteConstraintund einiges tun können IRouteHandler, ist der leistungsstärkste Erweiterungspunkt für das Routing die RouteBaseUnterklasse. Diese Klasse kann erweitert werden, um sowohl eingehende Routen als auch die Generierung ausgehender URLs bereitzustellen. Dies macht sie zu einem One-Stop-Shop für alles, was mit der URL und der von der URL ausgeführten Aktion zu tun hat.

Um Ihrem zweiten Beispiel zu folgen und von /nach zu gelangen /home/7, benötigen Sie lediglich eine Route, die die entsprechenden Routenwerte hinzufügt.

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Routes directy to `/home/7`
        routes.MapRoute(
            name: "Home7",
            url: "",
            defaults: new { controller = "Home", action = "Index", version = 7 }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Wenn Sie jedoch zu Ihrem ursprünglichen Beispiel zurückkehren, in dem Sie eine zufällige Seite haben, ist dies komplexer, da sich die Routenparameter zur Laufzeit nicht ändern können. Es könnte also mit einer RouteBaseUnterklasse wie folgt gemacht werden.

public class RandomHomePageRoute : RouteBase
{
    private Random random = new Random();

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        RouteData result = null;

        // Only handle the home page route
        if (httpContext.Request.Path == "/")
        {
            result = new RouteData(this, new MvcRouteHandler());

            result.Values["controller"] = "Home";
            result.Values["action"] = "Index";
            result.Values["version"] = random.Next(10) + 1; // Picks a random number from 1 to 10
        }

        // If this isn't the home page route, this should return null
        // which instructs routing to try the next route in the route table.
        return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        var controller = Convert.ToString(values["controller"]);
        var action = Convert.ToString(values["action"]);

        if (controller.Equals("Home", StringComparison.OrdinalIgnoreCase) &&
            action.Equals("Index", StringComparison.OrdinalIgnoreCase))
        {
            // Route to the Home page URL
            return new VirtualPathData(this, "");
        }

        return null;
    }
}

Welche können im Routing registriert werden wie:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Routes to /home/{version} where version is randomly from 1-10
        routes.Add(new RandomHomePageRoute());

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Beachten Sie im obigen Beispiel, dass es möglicherweise sinnvoll ist, auch ein Cookie zu speichern, das die Homepage-Version aufzeichnet, auf die der Benutzer gekommen ist, damit er bei seiner Rückkehr dieselbe Homepage-Version erhält.

Beachten Sie auch, dass Sie mit diesem Ansatz das Routing so anpassen können, dass Abfragezeichenfolgenparameter berücksichtigt werden (diese werden standardmäßig vollständig ignoriert) und entsprechend zu einer geeigneten Controller-Aktion weitergeleitet.

Zusätzliche Beispiele


Was ist, wenn ich beim Eingeben einer Aktion nicht sofort übertragen möchte, sondern diese Aktion etwas arbeiten lassen und dann bedingt auf eine andere Aktion übertragen möchte? Das Ändern meines Routings, um direkt zum Übertragungsziel zu gelangen, funktioniert nicht. Es sieht also so aus, als wäre Server.TransferRequestes in MVC nicht "völlig unnötig".
ProfK

0

Keine Antwort an sich, aber eindeutig wäre die Anforderung nicht nur, dass die eigentliche Navigation die entsprechende Funktionalität von Webforms Server.Transfer () "ausführt", sondern dass all dies im Unit-Test vollständig unterstützt wird.

Daher sollte das ServerTransferResult wie ein RedirectToRouteResult "aussehen" und hinsichtlich der Klassenhierarchie so ähnlich wie möglich sein.

Ich denke darüber nach, indem ich mir Reflector anschaue und die RedirectToRouteResult-Klasse und auch die verschiedenen Controller-Basisklassenmethoden mache und diese dann über Erweiterungsmethoden zum Controller "hinzufüge". Vielleicht könnten dies statische Methoden innerhalb derselben Klasse sein, um das Herunterladen zu vereinfachen?

Wenn ich dazu komme, werde ich es veröffentlichen, sonst könnte mich vielleicht jemand anderes schlagen!


0

Dies habe ich erreicht, indem ich den Html.RenderActionHelfer in einer Ansicht nutzte :

@{
    string action = ViewBag.ActionName;
    string controller = ViewBag.ControllerName;
    object routeValues = ViewBag.RouteValues;
    Html.RenderAction(action, controller, routeValues);
}

Und in meinem Controller:

public ActionResult MyAction(....)
{
    var routeValues = HttpContext.Request.RequestContext.RouteData.Values;    
    ViewBag.ActionName = "myaction";
    ViewBag.ControllerName = "mycontroller";
    ViewBag.RouteValues = routeValues;    
    return PartialView("_AjaxRedirect");
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.