ASP.NET MVC'de önceki eyleme nasıl yönlendirebilirim?


122

Bazı sayfalarım olduğunu varsayalım

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

gibi yaygın bir yardımcı program denetleyicisini çağırabilir

locale/change/es veya authorization/login

Nasıl bu yöntemler (alırım change, login) Önceki eylemlere yönlendirmek için ( details, info, bar) onlara önceki parametreleri geçerken ( 5, bob, 7)?

Kısaca: Başka bir denetleyicide bir eylem gerçekleştirdikten sonra az önce ziyaret ettiğim sayfaya nasıl yönlendirebilirim?

Yanıtlar:


156

Deneyin:

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

alternatif olarak, darin'in söylediklerine dokunarak şunu deneyin:

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

sonra:

public ActionResult MyNextAction()
{
    return Redirect(Request.QueryString["r"]);
}

Sadece bir öneri: "Yeniden Yönlendir" i kullanabilirsiniz, açıkça kontrol cihazınızı test etmek daha zordur. Bunun yerine "RedirectToAction" kullanmanız daha iyi olur.
Syd

Ben kullanarak tavsiye ediyorum Request.Url.AbsolutePath.ToString()olarak AccountControllers' LogOnyöntemi ile URL başlangıcı için kontrolleri içeriyor '/'vb
fulvio

1
@gotnull Request.Url.AbsolutePath aynı eyleme yönlendirecektir. Hangisi istenen çıktı değil. İkinci son eyleme geri dönmeliyiz. Bunun için şunu yazabiliriz: return Redirect (ControllerContext.HttpContext.Request.UrlReferrer.ToString ());
Rahatur

22
@nathanridley: Bu POST istekleri için çalışmaz. Kullanıcının bulunduğu Say GET Indexsonra GET Edit. Yönlendiren URL bu durumda, Indexancak kullanıcı yaptığında POST Edityönlendiren şimdi Editönceki GET isteğindendir. POST EditKullanıcıyı yönlendiren URL'yi bildiğinden nasıl emin olabilirim GET Edit?
one.beat.consumer

UrlReferrer, bir sayfadayken ve görüntülemek istediğimde NULL oluyor, sadece adres çubuğuna URL girerek hata aldığımı biliyorum. Adres Çubuğuna URL girdiğimde neden UrlReferrer'ı belirleyemiyor?
QMaster

47

Görünümdeki bir düğmeden yeniden yönlendirmek istiyorsanız şunları kullanabilirsiniz:

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

28

Birim testi ile ilgilenmiyorsanız, basitçe yazabilirsiniz:

return Redirect(ControllerContext.HttpContext.Request.UrlReferrer.ToString());

9

Bunun nasıl yapılacağına dair bir öneri şu şekilde:

  1. dönüş url'si bir formun POST isteğinden (ve başarısız olan tüm doğrulamalardan) kurtulur
  2. dönüş url'si ilk yönlendirme url'sinden belirlenir
  3. TempData [] veya diğer sunucu tarafı durumunu kullanmadan
  4. eyleme doğrudan gezinmeyi yönetir (varsayılan bir yönlendirme sağlayarak)

.

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

Yönlendirmeyi görünüm içinde şu şekilde kullanabilirsiniz:

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

9

Mvc'de java komut dosyası ile Görünüm Sayfasında düz html kullanarak onclick

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

Bu harika çalışıyor. umut birine yardım eder.

@JuanPieterse kullanarak cevap verdi, @Html.ActionLinkböylece mümkünse birisi yorum yapabilir veya kullanarak cevap verebilir@Url.Action


6

Değişiklik ve oturum açma eylemlerine bir returnUrl parametresi (url kodlu) ve verilen bu returnUrl'ye yönlendirme içinde iletin. Giriş işleminiz şunun gibi görünebilir:

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

5

NET Core 2 MVC kullanıyorum ve bu benim için çalıştı, denetleyici kullanımında HttpContext.Request.Headers["Referer"];


1

ViewBag.ReturnUrlProperty kullanarak önceki sayfaya dönebilirsiniz .


1

Herhangi bir Görünümde returnUrl'yi dinamik olarak oluşturmak için şunu deneyin:

@{
    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/@object.ID?returnUrl=@Url.Action(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>

Bu ayrıca Düzen Sayfalarında, Kısmi Görünümlerde ve Html Yardımcılarında da çalışır

İlgili: MVC3 Dinamik Dönüş URL'si (Aynı ancak herhangi bir Denetleyici / Eylem içinden)


0

For ASP.NET Çekirdek Sen asp-route- * özelliğini kullanabilirsiniz:

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

Diğer ayrıntılardaki örnek: Eylemlere sahip bir Araç Kontrolörünüz olduğunu hayal edin

indeks

ayrıntılar

Düzenle

ve herhangi bir aracı Dizinden veya Ayrıntılar'dan düzenleyebilirsiniz, bu nedenle, dizinden düzenle'ye tıkladıysanız, düzenlemeden sonra dizine dönmelisiniz ve ayrıntılardan düzenlemeyi tıkladıysanız, düzenlemeden sonra ayrıntılara dönmelisiniz.

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

Denetleyicinizde:

// 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);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.