【问题标题】:ASP.NET MVC how to implement link which returns to previous page?ASP.NET MVC如何实现返回上一页的链接?
【发布时间】:2009-06-27 08:30:03
【问题描述】:

标题说明了一切。

一些上下文:
我有一个搜索机制——搜索视图、搜索结果视图和一个详细信息视图(它代表一项结果,就像 webforms 中的表单视图)。我想要详细信息视图中的链接,它将用户返回到搜索结果视图。

想法
刚刚阅读了有关 TempData 的信息,但我想这无济于事,因为用户可能会在他想要返回之前调用一些操作。

会话可能有效,但我不确定我应该如何处理它。

我不想使用 javascript 来完成这个。

编辑:
似乎我会坚持使用 eu-ge-ne 的解决方案。结果如下:

#region usages

using System.Web.Mvc;
using CompanyName.UI.UIApp.Infrastructure.Enums;

#endregion

namespace CompanyName.UI.UIApp.Infrastructure.Filters
{
    /// <summary>
    /// Apply on action method to store URL of request in session
    /// </summary>
    public class RememberUrlAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting  
           (ActionExecutingContext filterContext)
        {
            var httpContext = filterContext.HttpContext;

            if (httpContext.Request.RequestType == "GET"
                && !httpContext.Request.IsAjaxRequest())
            {
                SessionManager
                .Save(SessionKey.PreviousUrl,
                      SessionManager.Get(SessionKey.CurrentUrl) ??
                      httpContext.Request.Url);

                SessionManager
                .Save(SessionKey.CurrentUrl,
                      httpContext.Request.Url);
            }
        }
    }
}

顺便说一句,.IsAjaxRequest() 方法是如何工作的?它只理解 MS AJAX 还是比它更聪明?

【问题讨论】:

  • 您可能想解释一下您不想使用 javascript...至少我假设您不想使用?
  • 实际上,我看不出 javascript 有什么帮助。即使它可以,如果它与导航相关,我对 js 持谨慎态度,因为搜索引擎不理解 js。
  • “.IsAjaxRequest() 方法是如何工作的?” - 它在请求中查找“X-Requested-With”。应该与 MSAjax 和 jQuery 一起使用。查看 ASP.NET MVC 源码 -> AjaxRequestExtension.cs

标签: asp.net-mvc session


【解决方案1】:

我认为您需要类似这样的自定义过滤器(未测试 - 目前没有 VS):

public class PrevUrlAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var httpContext = filterContext.HttpContext;
        var session = filterContext.HttpContext.Session;

        if (httpContext.Request.RequestType == "GET"
            && !httpContext.Request.IsAjaxRequest())
        {
            session["PrevUrl"] = session["CurUrl"] ?? httpContext.Request.Url;
            session["CurUrl"] = httpContext.Request.Url;
        }
    }
}

【讨论】:

  • 啊哈……也想到了一个过滤器。我试试看。
  • 还有一个问题 - 你的过滤器会选择以前的 URL,而不是当前的(我将过滤器命名为 RememberUrl,所以 - 它应该记住当前的 URL)。但这已经很容易解决了。 ;)
【解决方案2】:

您可以检查 HTTP Referrer 标头以检索以前的 URL。

当然,你必须优雅地处理,以防用户没有传入这个值。

【讨论】:

  • 如果用户在详情页做了什么?他可能会在那里调用一些动作。这将使检查和记住 Referrer 标头变得非常棘手。
  • 如果referrer标头在您的场景中被证明是有用的,可以在Request.UrlReferrer中找到它
【解决方案3】:
<a href="javascript:go(-1)">Yo</a>

:)

【讨论】:

  • 如果用户在一个页面中并执行了一些将他重定向到同一页面的操作,这只会将他再次返回到同一页面...
猜你喜欢
  • 2012-04-04
  • 2017-07-02
  • 2010-09-18
  • 2010-10-06
  • 1970-01-01
  • 2012-06-03
  • 2020-09-02
  • 2013-07-16
  • 2010-11-27
相关资源
最近更新 更多