Wie leite ich zur vorherigen Aktion in ASP.NET MVC um?

122

Nehmen wir an, ich habe einige Seiten

  • some.web/articles/details/5
  • some.web/users/info/bob
  • some.web/foo/bar/7

das kann einen gängigen Utility-Controller wie nennen

locale/change/es oder authorization/login

Wie bekomme ich diese Methoden ( change, login) zu den bisherigen Maßnahmen zur Umleitung ( details, info, bar) , während die bisherigen Parameter ihnen vorbei ( 5, bob, 7)?

Kurz gesagt: Wie leite ich zu der Seite um, die ich gerade besucht habe, nachdem ich eine Aktion in einem anderen Controller ausgeführt habe?

adolfojp
quelle

Antworten:

156

Versuchen:

public ActionResult MyNextAction()
{
    return Redirect(Request.UrlReferrer.ToString());
}

Versuchen Sie alternativ Folgendes:

public ActionResult MyFirstAction()
{
    return RedirectToAction("MyNextAction",
        new { r = Request.Url.ToString() });
}

dann:

public ActionResult MyNextAction()
{
    return Redirect(Request.QueryString["r"]);
}
Nathan Ridley
quelle
Nur ein Vorschlag: Sie können "Redirect" explizit verwenden. Es ist schwieriger, Ihren Controller einem Unit-Test zu unterziehen. Verwenden Sie stattdessen besser eine "RedirectToAction".
Syd
Ich würde empfehlen die Verwendung Request.Url.AbsolutePath.ToString()als die AccountController‚s - LogOnMethode enthält Kontrollen für URLs Anfang mit '/'etc.
fulvio
1
@gotnull Request.Url.AbsolutePath leitet zur gleichen Aktion um. Welches ist nicht die gewünschte Ausgabe. Wir müssen zur vorletzten Aktion zurückkehren. Dafür könnten wir schreiben: return Redirect (ControllerContext.HttpContext.Request.UrlReferrer.ToString ());
Rahatur
22
@ Nathanridley: Dies funktioniert nicht für POST-Anfragen. Angenommen, der Benutzer ist GET Indexdann eingeschaltet GET Edit. Die verweisende URL ist dann Indexaber dann, wenn der Benutzer dies tut, stammt POST Editder Verweis jetzt Editvon der vorhergehenden GET-Anfrage. Wie kann ich sicherstellen, POST Editdass die URL bekannt ist, auf die der Benutzer verwiesen hat GET Edit?
one.beat.consumer
UrlReferrer ist NULL, als ich auf einer Seite war und sehen möchte, dass ein Fehler aufgetreten ist, indem ich einfach die URL in die Adressleiste eingebe. Warum kann UrlReferrer nicht ermittelt werden, wenn ich eine URL in die Adressleiste eingebe?
QMaster
46

Wenn Sie von einer Schaltfläche in der Ansicht umleiten möchten, können Sie Folgendes verwenden:

@Html.ActionLink("Back to previous page", null, null, null, new { href = Request.UrlReferrer})
Unbekannt
quelle
28

Wenn Sie sich nicht mit Unit-Tests beschäftigen, können Sie einfach schreiben:

return Redirect(ControllerContext.HttpContext.Request.UrlReferrer.ToString());
Rahatur
quelle
9

Ein Vorschlag, wie dies zu tun ist, so dass:

  1. Die Rückgabe-URL überlebt die POST-Anforderung eines Formulars (und alle fehlgeschlagenen Überprüfungen).
  2. Die Rückgabe-URL wird aus der anfänglichen Überweisungs-URL ermittelt
  3. ohne TempData [] oder einen anderen serverseitigen Status zu verwenden
  4. übernimmt die direkte Navigation zur Aktion (durch Bereitstellung einer Standardumleitung)

.

public ActionResult Create(string returnUrl)
{
    // If no return url supplied, use referrer url.
    // Protect against endless loop by checking for empty referrer.
    if (String.IsNullOrEmpty(returnUrl)
        && Request.UrlReferrer != null
        && Request.UrlReferrer.ToString().Length > 0)
    {
        return RedirectToAction("Create",
            new { returnUrl = Request.UrlReferrer.ToString() });
    }

    // Do stuff...
    MyEntity entity = GetNewEntity();

    return View(entity);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(MyEntity entity, string returnUrl)
{
    try
    {
        // TODO: add create logic here

        // If redirect supplied, then do it, otherwise use a default
        if (!String.IsNullOrEmpty(returnUrl))
            return Redirect(returnUrl);
        else
            return RedirectToAction("Index");
    }
    catch
    {
        return View();  // Reshow this view, with errors
    }
}

Sie können die Umleitung in der Ansicht folgendermaßen verwenden:

<% if (!String.IsNullOrEmpty(Request.QueryString["returnUrl"])) %>
<% { %>
    <a href="<%= Request.QueryString["returnUrl"] %>">Return</a>
<% } %>

quelle
9

In Mvc mit einfachem HTML in View Page mit Java-Skript onclick

<input type="button" value="GO BACK" class="btn btn-primary" 
onclick="location.href='@Request.UrlReferrer'" />

Das funktioniert super. Hoffnung hilft jemandem.

@JuanPieterse hat bereits mit geantwortet, @Html.ActionLinksodass wenn möglich jemand mit kommentieren oder antworten kann@Url.Action

Shaijut
quelle
6

Übergeben Sie einen returnUrl Parameter (URL - kodiert) an die Änderung und Login Aktionen und innerhalb Umleitung zu dieser gegebenen returnUrl. Ihre Anmeldeaktion könnte ungefähr so ​​aussehen:

public ActionResult Login(string returnUrl) 
{
    // Do something...
    return Redirect(returnUrl);
}
Darin Dimitrov
quelle
5

Ich verwende .Net Core 2 MVC, und dieses hat bei der Verwendung des Controllers für mich funktioniert HttpContext.Request.Headers["Referer"];

Saad Hasan
quelle
1

Sie können mithilfe der ViewBag.ReturnUrlEigenschaft zur vorherigen Seite zurückkehren .

Almaceleste
quelle
1

Versuchen Sie Folgendes, um die returnUrl in einer beliebigen Ansicht dynamisch zu erstellen:

@{
    var formCollection =
        new FormCollection
            {
                new FormCollection(Request.Form),
                new FormCollection(Request.QueryString)
            };

    var parameters = new RouteValueDictionary();

    formCollection.AllKeys
        .Select(k => new KeyValuePair<string, string>(k, formCollection[k])).ToList()
        .ForEach(p => parameters.Add(p.Key, p.Value));
}

<!-- Option #1 -->
@Html.ActionLink("Option #1", "Action", "Controller", parameters, null)

<!-- Option #2 -->
<a href="/Controller/Action/@[email protected](ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), parameters)">Option #2</a>

<!-- Option #3 -->
<a href="@Url.Action("Action", "Controller", new { object.ID, returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), parameters) }, null)">Option #3</a>

Dies funktioniert auch in Layoutseiten, Teilansichten und HTML-Helfern

Verwandte: MVC3 Dynamic Return URL (Gleiche, jedoch innerhalb eines Controllers / einer Aktion)

Matthew Hudson
quelle
0

Für ASP.NET Core Sie können das Attribut asp-route- * verwenden:

<form asp-action="Login" asp-route-previous="@Model.ReturnUrl">

Weitere Details im Detail: Stellen Sie sich vor, Sie haben einen Fahrzeugcontroller mit Aktionen

Index

Einzelheiten

Bearbeiten

Sie können jedes Fahrzeug über den Index oder über Details bearbeiten. Wenn Sie also auf Bearbeiten aus Index klicken, müssen Sie nach der Bearbeitung zum Index zurückkehren. Wenn Sie auf Details bearbeiten klicken, müssen Sie nach der Bearbeitung zu den Details zurückkehren.

//In your viewmodel add the ReturnUrl Property
public class VehicleViewModel
{
     ..............
     ..............
     public string ReturnUrl {get;set;}
}



Details.cshtml
<a asp-action="Edit" asp-route-previous="Details" asp-route-id="@Model.CarId">Edit</a>

Index.cshtml
<a asp-action="Edit" asp-route-previous="Index" asp-route-id="@item.CarId">Edit</a>

Edit.cshtml
<form asp-action="Edit" asp-route-previous="@Model.ReturnUrl" class="form-horizontal">
        <div class="box-footer">
            <a asp-action="@Model.ReturnUrl" class="btn btn-default">Back to List</a>
            <button type="submit" value="Save" class="btn btn-warning pull-right">Save</button>
        </div>
    </form>

In Ihrem Controller:

// GET: Vehicle/Edit/5
    public ActionResult Edit(int id,string previous)
    {
            var model = this.UnitOfWork.CarsRepository.GetAllByCarId(id).FirstOrDefault();
            var viewModel = this.Mapper.Map<VehicleViewModel>(model);//if you using automapper
    //or by this code if you are not use automapper
    var viewModel = new VehicleViewModel();

    if (!string.IsNullOrWhiteSpace(previous)
                viewModel.ReturnUrl = previous;
            else
                viewModel.ReturnUrl = "Index";
            return View(viewModel);
        }



[HttpPost]
    public IActionResult Edit(VehicleViewModel model, string previous)
    {
            if (!string.IsNullOrWhiteSpace(previous))
                model.ReturnUrl = previous;
            else
                model.ReturnUrl = "Index";
            ............. 
            .............
            return RedirectToAction(model.ReturnUrl);
    }
Mohamed Elamin
quelle