আমি কীভাবে এএসপি.নেট এমভিসিতে আগের ক্রিয়ায় পুনর্নির্দেশ করব?


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পদ্ধতি URL- এর সংগে জন্য চেক রয়েছে '/'ইত্যাদি,
fulvio

1
@ গোটনুল রিকোয়েস্ট.আরুল.আবলসপথ একই ক্রিয়ায় পুনর্নির্দেশ করবে। যা কাঙ্ক্ষিত আউটপুট নয়। আমাদের দ্বিতীয় শেষ কর্মে ফিরতে হবে। তার জন্য আমরা লিখতে পারি: রিটার্ন রিটার্নেট (কন্ট্রোলার কনটেক্সট। HTTPContext.Request.UllReferrer.ToString ());
রাহাতুর

22
@ নাথান্রিডলি: এটি পোস্টের অনুরোধগুলির জন্য কাজ করে না। ব্যবহারকারী GET Indexতখন চালু আছে বলুন GET Edit। উল্লেখ করা URL তারপর Indexকিন্তু তারপর যখন ব্যবহারকারী আছে POST Editরেফারার এখন Editপূর্ববর্তী পেতে অনুরোধ থেকে। POST Editব্যবহারকারীকে যে ইউআরএল উল্লেখ করেছে তা আমি কীভাবে নিশ্চিত করতে পারি GET Edit?
one.beat.consumer

আমি যখন কয়েকটি পৃষ্ঠায় ছিলাম এবং ঠিক ঠিকানা বারে ইউআরএল প্রবেশ করিয়ে ত্রুটি পেয়েছি জানতে চাইলে urlFefer নাল হয়। যখন আমি ঠিকানা বারে ইউআরএল প্রবেশ করি কেন এটি আরলরেফারার নির্ধারণ করতে পারে না?
কিউমাস্টার

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 একটি ফর্মের পোস্ট অনুরোধ বেঁচে আছে (এবং কোনও ব্যর্থ বৈধতা)
  2. প্রারম্ভিক url প্রাথমিক রেফারেল url থেকে নির্ধারিত হয়
  3. টেম্পাডেটা [] বা অন্য সার্ভার-সাইড স্থিতি ব্যবহার না করে
  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

এমভিসিতে জাভা স্ক্রিপ্ট অনক্লিক সহ পৃষ্ঠাতে দেখুন পৃষ্ঠায় এইচটিএমএল ব্যবহার করে

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

এটি দুর্দান্ত কাজ করে। আশা কাউকে সাহায্য করে

@ জুয়ানপিয়েটারস ইতিমধ্যে এমনটি ব্যবহার করে উত্তর দিয়েছেন @Html.ActionLinkযদি সম্ভব হয় কেউ মন্তব্য করে বা উত্তর দিয়ে উত্তর দিতে পারে@Url.Action


6

পরিবর্তন এবং লগইন ক্রিয়ায় একটি রিটার্নআরল প্যারামিটার (url এনকোডড) পাস করুন এবং অভ্যন্তরীণভাবে এই প্রদত্ত রিটার্নআরএলকে পুনর্নির্দেশ করুন। আপনার লগইন ক্রিয়াটি এরকম কিছু দেখতে পারে:

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

5

আমি। নেট কোর 2 এমভিসি ব্যবহার করছি, এবং এটি নিয়ামক ব্যবহারে আমার জন্য কাজ করেছে 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>

এটি লেআউট পৃষ্ঠাগুলি, আংশিক দৃশ্য এবং এইচটিএমএল সহায়কগুলিতেও কাজ করে

সম্পর্কিত: এমভিসি 3 ডায়নামিক রিটার্ন URL (একই তবে যে কোনও নিয়ন্ত্রণকারীর / কর্মের মধ্যে থেকে)


0

জন্য ASP.NET কোর আপনি ASP-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);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.