防止后退按钮

时间:2012-10-19 16:11:32

标签: c# asp.net-mvc razor back-button

我在使用C#的ASP.NET MVC上使用Razor。

我打电话给外部网页处理信用卡,然后它返回给我。然后我显示收据。

我想阻止他们回到上一个屏幕。

我没有底层的cs页面,比如asp,因为这些是.cshtml文件,来抓住这个事件。

此收据页面是一个视图,因此我无法将JavaScript放入标题中,因为它会影响使用它的每个页面。

在这种情况下,有人知道我如何阻止后退按钮吗?

6 个答案:

答案 0 :(得分:14)

一种可能性是在客户端上排除您不希望从缓存中恢复的页面。这可以通过设置适当的响应头来完成。这是一个带有[NoCache]自定义动作过滤器的示例,您可以使用它来装饰相应的控制器动作。

答案 1 :(得分:6)

首先,如果上一页向服务器发布了数据,则在成功处理后最好Redirect(...)向另一个操作发送,以避免在"刷新"上重新提交数据。

然后还将页面设置为过期,因此后退按钮不起作用:

https://stackoverflow.com/a/5352953/864763

答案 2 :(得分:3)

你问的是错误的问题。不要试图禁用客户端上的“后退”。这将注定要失败;你可能会变得更难,但你永远不会赢得这场斗争。相反,您应该重新编写您拥有的特定页面,以便它只会处理一次信用卡。你应该(在服务器上)“记住”你已经处理了信用卡,这样如果用户回到页面重新提交,你可以给他们一条错误信息,说“你已经提交了这些信息,你不能提交此请求两次“。

现在,有几种方法可以实现这个总体目标,有些方法比其他方法更好,但这是你需要努力的目标。

执行此操作的一种方法是转到将用户重定向到此信用卡表单的每个页面;在提交请求之前,向该用户的会话添加内容(即"pendingCreditCardSubmission" = true)一旦他们提交了该请求,您就会检查该会话变量。如果确实如此,请提交请求并将其设置为false,如果它为false,则向用户发送错误消息。

答案 3 :(得分:2)

我们就是这样做的:

public class NoBackFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.ExpiresAbsolute = DateTime.Now;
        filterContext.HttpContext.Response.Expires = 0;
        filterContext.HttpContext.Response.CacheControl = "no-cache";
        filterContext.HttpContext.Response.Buffer = true;
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow);
        filterContext.HttpContext.Response.Cache.SetNoStore();
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        if (!filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.HttpContext.Request.HttpMethod != "POST" && !filterContext.Controller.ControllerContext.IsChildAction)
        {
            var after = filterContext.HttpContext.Request.RawUrl;
            var session = GetSession(filterContext);
            if (session["Current"] != null)
            {


                if (session["Before"] != null && session["Before"].ToString() == after)
                    filterContext.HttpContext.Response.Redirect(session["Current"].ToString());
                else
                {
                    session["Before"] = session["Current"];
                    session["Current"] = after;
                }
            }
            else
            {
                session["Current"] = after;
            }
        }
        base.OnActionExecuting(filterContext);

    }

    private HttpSessionStateBase GetSession(ActionExecutingContext context)
    {
        return context.HttpContext.Session;
    }

}

在此之后,您可以在一般范围或控制器范围内实现它。

答案 4 :(得分:1)

自从被问到这个问题已经很久了,但是我的修复是在WebPageController类之上添加了[NoCache]。

 [NoCache]
public class WebPageController : Controller
{
    public JsonResult JsonError(Exception exception)
    {
        if (exception == null) throw new ArgumentNullException("exception");

        Response.StatusCode = 500;

        return new JsonResult
        {
            JsonRequestBehavior = JsonRequestBehavior.AllowGet,
            Data = new
            {
                error = true,
                success = false,
                message = exception.Message,
                detail = exception.ToString()
            }
        };
    }

答案 5 :(得分:0)

在MVC aspnet框架中,您可以选择RedirectToActionPermanent

然后它告诉浏览器 301 响应代码。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase.redirecttoactionpermanent?view=aspnetcore-5.0