Bagaimana cara mengalihkan ke tindakan sebelumnya di ASP.NET MVC?

122

Misalkan saya memiliki beberapa halaman

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

yang dapat memanggil pengontrol utilitas umum seperti

locale/change/es atau authorization/login

Bagaimana cara mendapatkan metode ini ( change, login) untuk mengarahkan ke tindakan sebelumnya ( details, info, bar) sementara lewat parameter sebelumnya kepada mereka ( 5, bob, 7)?

Singkatnya: Bagaimana cara mengalihkan ke halaman yang baru saja saya kunjungi setelah melakukan tindakan di pengontrol lain?

adolfojp.dll
sumber

Jawaban:

156

mencoba:

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

Sebagai alternatif, menyentuh apa yang dikatakan darin, coba ini:

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

kemudian:

public ActionResult MyNextAction()
{
    return Redirect(Request.QueryString["r"]);
}
Nathan Ridley
sumber
Hanya saran: Anda dapat menggunakan "Redirect" jelas lebih sulit untuk menguji unit pengontrol Anda. Anda lebih baik menggunakan "RedirectToAction" sebagai gantinya.
Syd
Saya akan merekomendasikan menggunakan Request.Url.AbsolutePath.ToString()sebagai AccountController's LogOnmetode berisi cek untuk awal URL dengan '/', dll
fulvio
1
@gotnull Request.Url.AbsolutePath akan mengalihkan ke tindakan yang sama. Yang bukan merupakan keluaran yang diinginkan. Kami harus kembali ke aksi terakhir kedua. Untuk itu kita bisa menulis: return Redirect (ControllerContext.HttpContext.Request.UrlReferrer.ToString ());
Rahatur
22
@nathanridley: Ini tidak berfungsi untuk permintaan POST. Katakanlah pengguna adalah pada GET Indexkemudian GET Edit. URL pengarah kemudian adalah Indextetapi kemudian ketika pengguna melakukan POST Editpengarah sekarang Editdari permintaan GET sebelumnya. Bagaimana saya bisa memastikan POST Editmengetahui URL yang merujuk pengguna GET Edit?
one.beat.consumer
UrlReferrer adalah NULL ketika saya berada di beberapa halaman dan ingin melihat saya tahu ada kesalahan hanya dengan memasukkan URL di address bar. Mengapa saat saya memasukkan URL di Bilah Alamat, URL tidak dapat menentukan UrlReferrer?
QMaster
46

Jika Anda ingin mengalihkan dari tombol di Tampilan, Anda dapat menggunakan:

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

Jika Anda tidak peduli dengan pengujian unit maka Anda cukup menulis:

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

Sebuah saran bagaimana melakukan ini sedemikian rupa sehingga:

  1. url kembali bertahan dari permintaan POST formulir (dan validasi yang gagal)
  2. url kembali ditentukan dari url rujukan awal
  3. tanpa menggunakan TempData [] atau status sisi server lainnya
  4. menangani navigasi langsung ke tindakan (dengan menyediakan pengalihan default)

.

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

Anda dapat menggunakan pengalihan dalam tampilan seperti ini:

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

sumber
9

Di Mvc menggunakan html biasa di View Page dengan java script onclick

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

Ini bekerja dengan baik. harapan membantu seseorang.

@JuanPieterse telah menjawab menggunakan @Html.ActionLinkjadi jika memungkinkan seseorang dapat berkomentar atau menjawab menggunakan@Url.Action

shaijut
sumber
6

Meneruskan parameter returnUrl (url encoded) ke tindakan perubahan dan login dan di dalam redirect ke returnUrl yang diberikan ini. Tindakan login Anda mungkin terlihat seperti ini:

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

Saya menggunakan .Net Core 2 MVC, dan yang ini bekerja untuk saya, dalam penggunaan pengontrol HttpContext.Request.Headers["Referer"];

Saad Hasan
sumber
1

Anda dapat kembali ke halaman sebelumnya dengan menggunakan ViewBag.ReturnUrlproperti.

almaceleste.dll
sumber
1

Untuk membangun returnUrl secara dinamis dalam tampilan apa pun, coba ini:

@{
    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>

Ini juga berfungsi di Halaman Tata Letak, Tampilan Parsial, dan Pembantu Html

Terkait: MVC3 Dynamic Return URL (Sama tetapi dari dalam Pengontrol / Tindakan apa pun)

Matthew Hudson
sumber
0

Untuk ASP.NET Core Anda dapat menggunakan atribut asp-route- *:

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

Contoh detail lainnya: Bayangkan Anda memiliki Pengontrol Kendaraan dengan tindakan

Indeks

Detail

Sunting

dan Anda dapat mengedit kendaraan apa pun dari Indeks atau dari Detail, jadi jika Anda mengklik edit dari indeks, Anda harus kembali ke indeks setelah mengedit dan jika Anda mengklik edit dari detail, Anda harus kembali ke detail setelah mengedit.

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

Di pengontrol Anda:

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