मैं ASP.NET MVC में पिछली कार्रवाई के लिए कैसे पुनर्निर्देशित करूं?


122

मान लीजिए कि मेरे पास कुछ पृष्ठ हैं

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

जैसे कि एक सामान्य उपयोगिता नियंत्रक कह सकते हैं

locale/change/es या authorization/login

मैं इन तरीकों (कैसे मिलता है change, login) पिछले कार्यों पर रीडायरेक्ट करने ( details, info, bar) उन्हें पिछले पैरामीटर प्रदान करने, जबकि ( 5, bob, 7)?

संक्षेप में: मैं उस पृष्ठ पर कैसे पुनर्निर्देशित कर सकता हूं जिसे मैंने किसी अन्य नियंत्रक में कार्रवाई करने के बाद देखा था?

जवाबों:


156

प्रयत्न:

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

वैकल्पिक रूप से, दारन ने क्या कहा, इस पर स्पर्श करके देखें:

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

फिर:

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

बस एक सुझाव: आप "रीडायरेक्ट" का उपयोग कर सकते हैं, जो आपके नियंत्रक को जांचने के लिए कठिन है। आप इसके बजाय "पुनर्निर्देशन" का उपयोग करके बेहतर हैं।
सिड

मैं का उपयोग कर की सलाह देते हैं Request.Url.AbsolutePath.ToString()के रूप में AccountControllerकी LogOnविधि यूआरएल के साथ शुरुआत के लिए चेक में शामिल है '/'आदि,
Fulvio

1
@gotnull Request.Url.AbsolutePath उसी एक्शन पर रीडायरेक्ट करेगा। जो वांछित आउटपुट नहीं है। हमें दूसरी अंतिम क्रिया पर लौटना होगा। उसके लिए हम लिख सकते हैं: रिडायरेक्ट (नियंत्रककंटेक्ट.एचटीपीकॉनटेक्स्ट.रैवेस्ट.उल.रिफर्रर .टॉस्ट्रिंग ());
रहतुर

22
@nathanridley: यह POST अनुरोधों के लिए काम नहीं करता है। कहो उपयोगकर्ता GET Indexतो पर है GET Edit। संदर्भ देने वाला URL तो है Indexलेकिन फिर जब उपयोगकर्ता करता POST Editरेफरर अब Editपूर्ववर्ती GET अनुरोध से। मैं यह कैसे सुनिश्चित कर सकता हूं POST Editकि उपयोगकर्ता को संदर्भित URL पता है GET Edit?
one.beat.consumer

UrlReferrer तब NULL होता है जब मैं किसी पेज में था और यह देखना चाहता हूं कि मुझे पता बार में URL दर्ज करने से त्रुटि मिली। जब मैं पता बार में URL दर्ज करता हूं तो यह UrlReferrer निर्धारित नहीं कर सकता है?
क्यूमास्टर Q

46

यदि आप दृश्य में एक बटन से रीडायरेक्ट करना चाहते हैं तो आप उपयोग कर सकते हैं:

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

28

यदि आप इकाई परीक्षण से चिंतित नहीं हैं तो आप बस लिख सकते हैं:

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

9

ऐसा करने के लिए एक सुझाव ऐसा है कि:

  1. वापसी url एक फॉर्म के POST अनुरोध (और किसी भी विफल सत्यापन) से बच जाता है
  2. वापसी यूआरएल प्रारंभिक रेफरल यूआरएल से निर्धारित होता है
  3. TempData [] या अन्य सर्वर साइड स्टेट का उपयोग किए बिना
  4. कार्रवाई के लिए सीधे नेविगेशन संभालती है (डिफ़ॉल्ट रीडायरेक्ट प्रदान करके)

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

आप इस तरह से देखने के भीतर पुनर्निर्देशित का उपयोग कर सकते हैं:

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

9

Mava में java script onclick के साथ View Page में सादे html का उपयोग करते हैं

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

यह बहुत अच्छा काम करता है। आशा किसी की मदद करती है।

@JuanPieterse ने पहले से ही @Html.ActionLinkइसका उपयोग करने का उत्तर दिया है यदि संभव हो तो कोई भी टिप्पणी कर सकता है या उपयोग करके उत्तर दे सकता है@Url.Action


6

परिवर्तन और लॉगिन क्रियाओं के लिए एक रिटर्न यूआरएल पैरामीटर (यूआरएल एन्कोडेड) पास करें और इस दिए गए रिटर्न यूआरएल के अंदर रीडायरेक्ट करें। आपकी लॉगिन क्रिया कुछ इस तरह दिख सकती है:

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

5

मैं .Net Core 2 MVC का उपयोग कर रहा हूं, और इस एक ने मेरे लिए, नियंत्रक उपयोग में काम किया HttpContext.Request.Headers["Referer"];


1

आप ViewBag.ReturnUrlसंपत्ति का उपयोग करके पिछले पृष्ठ पर लौट सकते हैं।


1

किसी भी दृश्य में गतिशील रूप से वापसी का निर्माण करने के लिए, यह प्रयास करें:

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

यह लेआउट पेज, आंशिक दृश्य और एचटीएमएल हेल्पर्स में भी काम करता है

संबंधित: MVC3 डायनामिक रिटर्न URL (समान लेकिन किसी भी कंट्रोलर / एक्शन के भीतर से)


0

के लिए ASP.NET कोर आप एएसपी-route- * विशेषता का उपयोग कर सकते हैं:

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

अन्य विवरण उदाहरण में: कल्पना करें कि आपके पास कार्यों के साथ एक वाहन नियंत्रक है

सूची

विवरण

संपादित करें

और आप किसी भी वाहन को इंडेक्स से या डिटेल्स से एडिट कर सकते हैं, इसलिए यदि आपने इंडेक्स से एडिट पर क्लिक किया है तो आपको एडिट के बाद इंडेक्स पर लौटना होगा और अगर आपने एडिट को क्लिक किया तो आपको एडिट के बाद डिटेल्स पर लौटना होगा।

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

आपके नियंत्रक में:

// 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);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.