C# 防止后退按钮

C# 防止后退按钮,c#,asp.net-mvc,razor,back-button,C#,Asp.net Mvc,Razor,Back Button,我在ASP.NET MVC和C#上使用Razor 我正在调用一个外部网页来处理信用卡,它会返回给我。然后我显示一张收据 我想阻止他们返回上一个屏幕 我没有像asp这样的底层cs页面,因为它们是.cshtml文件,所以无法捕获事件 这个收据页面是一个视图,所以我不能将JavaScript放在标题中,因为它会影响使用它的每个页面 有人知道在这种情况下如何防止“后退”按钮吗?一种可能是将不想返回的页面从客户端缓存中排除。这可以通过设置适当的响应头来实现。下面是一个自定义操作过滤器的示例,您可以使用它来

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

我正在调用一个外部网页来处理信用卡,它会返回给我。然后我显示一张收据

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

我没有像asp这样的底层cs页面,因为它们是.cshtml文件,所以无法捕获事件

这个收据页面是一个视图,所以我不能将JavaScript放在标题中,因为它会影响使用它的每个页面


有人知道在这种情况下如何防止“后退”按钮吗?

一种可能是将不想返回的页面从客户端缓存中排除。这可以通过设置适当的响应头来实现。下面是一个自定义操作过滤器的示例,您可以使用它来装饰相应的控制器操作。

首先,如果上一页将数据发布到服务器,最好在成功处理后将(…)重定向到另一个操作,以避免在“刷新”时重新提交数据

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


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

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

一种方法是转到每个页面,将用户重定向到此信用卡表单;在提交请求之前,在该用户的会话中添加一些内容(即,一旦他们提交请求,您就可以检查该会话变量)。如果为true,则提交请求并将其设置为false,如果请求为false或不存在,则向用户发送错误消息。

我们就是这样做的:

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;
    }

}

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

很久没有提出此问题,但我的解决方案是在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()
            }
        };
    }

在MVC aspnet framework中,您可以选择
重定向到ActionPermanent

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


这将是一段javascript代码。C#与此无关,因为C#都是服务器端的。不过,我相信你可以搜索Stackoverflow来找到答案。此外,如果在Razor文件中使用节,则可以从特定的局部视图Razor文件向页面中注入javascript。查看此博客以了解更多信息:不能在浏览器上禁用脚本,而浏览器会忽略这一点吗?是的。你仍然需要编写代码来确保人们不会胡闹,不管发生什么。或者,如果js被禁用,就阻止用户使用该站点。这个决定取决于网站的功能,你的用户群等等。完美!!非常感谢你!在这里对一个老掉牙的答案大发雷霆!