如何在MVC3中返回调用页面,但略有不同?

时间:2013-07-17 13:02:31

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我需要调用另一个MVC3页面(P2),然后返回调用页面(P1)。然而,轻微的扭曲是P2需要自己调用,因此引用者最终可能是P2。

所以:

P1 - (P2 -> P2 -> P2) ->P1

所以问题是我如何获得P1的引荐来源URL并保留它,然后再使用它返回P1,无论P2调用自己的时间长短。

我确实试过填充ViewBag.Referrer:

       <a href="@ViewBag.Referrer">Back</a>

使用以下控制器代码,尝试仅在原始调用上设置它。但是,ViewBag.Referrer似乎总是拿起P2 Referrer URL,即使在调试模式下由于IsOriginalCall = 0而没有重置ViewBag.Referrer。真奇怪。就好像我在存储指针而不是值。

        public ViewResult Index(int id = 0, int IsOriginalCall = 0)
    {
        if (IsOriginalCall =1)
        {
        if (Request.UrlReferrer != null)
        {
        ViewBag.Referrer = Request.UrlReferrer.LocalPath;
        }
        }
        ViewBag.SLIid = id == 0 ? 4 : id;

        return View(db.StdSection.Where(r=>r.InWizard).OrderBy(r=>r.Name).ToList());
    }

非常感谢思想和解决方案。我一直在这个圈子里走来走去。

提前致谢。

编辑,尝试使用TempData:

致电代码:

@Html.ActionLink("Sections", "Index","SSLI2", new { id=item.Id, ReturnUrl = Request.Url.ToString() },null)

控制器:

    public ViewResult Index(string ReturnUrl, int id = 0)
    {
        if (ReturnUrl != "x")
        {
        //ViewBag.Referrer = Request.UrlReferrer.LocalPath;
          TempData["Referrer"] = ReturnUrl;
        }
        ViewBag.SLIid = id == 0 ? 4 : id;

        return View(db.StdSection.Where(r=>r.InWizard).OrderBy(r=>r.Name).ToList());
    }

查看:

<a href="@TempData["Referrer"]">Back</a>

产生:

<a href="">Back</a> when P2 goes back to P2, but seems to use P2 referrer URL ????

1 个答案:

答案 0 :(得分:0)

您可以从P1查询字符串传递ReferrerUrl,然后将值存储在TempData中。然后它将从一个动作调用过渡到另一个动作调用。

另一种选择是在查询字符串中从P1传递ReferrerUrl,然后将值放在P2上的隐藏输入中。

@Html.HiddenFor(m => m.ReferrerUrl)

@Html.Hidden("ReferrerUrl", ViewBag.ReferrerUrl)

然后在每个回发后选择值并再次将其渲染为隐藏的输入值。

修改

您可以尝试做类似的事情:

public ViewResult Index(string returnUrl, int id = 0)
{
    ViewBag.ReturnUrl = returnUrl;
    ViewBag.SLIid = id == 0 ? 4 : id;

    // This can be picked up in another action method.
    TempData["ReturnUrl"] = returnUrl;

    return View(db.StdSection.Where(r=>r.InWizard).OrderBy(r=>r.Name).ToList());
}

然后可以使用:

渲染它
<a href="@Html.Raw(ViewBag.ReturnUrl)">Back</a>