2

我需要在 MY MVC2 应用程序中实现后退按钮功能(在应用程序中使用显式后退按钮,而不是通过浏览器后退按钮)。

我已经使用了建议使用 Request.UrlReferrer 的ASP.net MVC 浏览了此处的“后退按钮功能”链接。并且只要我有 HTTP Get(因为它带有查询字符串),它就可以很好地工作。但是当上一页是没有查询字符串的 HTTP POST 时,我会遇到问题。

有没有人研究过这样的解决方案?

我们最初的想法是生成和存储像 Stack 这样的链接,并在用户单击“返回”按钮时一一弹出 url。但是,如果有更好的解决方案\设计模式可以帮助我实现这一目标?

4

1 回答 1

4

您可以将 returnurl 存储到 actionresult 路由值,并有一个用于反向链接的 html 助手。

帮手:

public static class HtmlHelpersExtensions
{
    public static MvcHtmlString BackLink(this HtmlHelper helper,string defaultAction)
    {
        string returnUrl = HttpContext.Current.Request["returnUrl"];
        // If there's return url param redirect to there
        if (!String.IsNullOrEmpty(returnUrl))
        {
            return new MvcHtmlString("<a href=" + returnUrl + " >Back</a>");
        }
        // if user just posted and there's no returnurl, redirect us to default
        else if (HttpContext.Current.Request.HttpMethod == "POST")
        {
            return helper.ActionLink("Back", defaultAction);
        }
        // we didn't post anything so we can safely go back to previous url
        return new MvcHtmlString("<a href=" + HttpContext.Current.Request.UrlReferrer.ToString() + " >Back</a>");
    }
}

控制器:

    public ActionResult MyAction(string returnUrl)
    {
        return View(new MyModel());
    }
    [HttpPost]
    public ActionResult MyAction(MyModel mm, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            // No returnurl, redirect us to somewhere
            if (string.IsNullOrEmpty(returnUrl))
                return RedirectToAction("Index");

            // redirect back
            return Redirect(returnUrl);
        }

        return View(mm);
    }

用法:

@Html.ActionLink("MyAction", "MyAction", new { returnUrl = Request.RawUrl.ToString() })

MyAction.cshtml 中的反向链接

@Html.BackLink("Index")

现在,帮助程序决定是使用 returnUrl 参数、默认操作还是通过 urlreferrer 带您返回。

于 2012-08-27T08:00:01.080 回答