Estoy utilizando la maquinilla de Afeitar en ASP.NET MVC con C#.

Estoy llamando a una página web externa al proceso de una tarjeta de crédito y se vuelve a mí. Yo, a continuación, mostrar un recibo.

Me gustaría que les impide volver a la pantalla anterior.

No tengo un subyacente cs página, como asp, ya que estos son .cshtml archivos, para agarrar el evento.

Esta página de recibo es un punto de Vista así que no puedo poner el JavaScript en la cabecera, ya que esto afectaría a cada página utilizando.

Alguien sabe cómo puedo prevenir el botón atrás en esta circunstancia?

  • Este será un javascript pieza de código para hacer esto. C# no tiene nada que ver con ella, como el C# es todo el lado del servidor. Estoy seguro de que usted puede buscar en Stackoverflow para la respuesta a esto, sin embargo. Edit: hice la búsqueda para usted.
  • Además, si se utilizan secciones de la maquinilla de Afeitar de archivos, usted puede inyectar código javascript en la página de una vista parcial de Afeitar archivo. Compruebe este blog para más info: weblogs.asp.net/scottgu/archive/2010/12/30/…
  • No puede secuencias de comandos ser deshabilitado en el navegador que sería ignorar esto?
  • Yup. Usted todavía tiene que escribir el código para asegurarse de que la gente no goof cosas, no importa qué. O simplemente evitar que los usuarios utilicen el sitio si js está deshabilitado. Esa decisión depende de lo que el sitio, la base de usuarios, etc…, sin embargo.
InformationsquelleAutor ErocM | 2012-10-19

5 Comentarios

  1. 14

    La posibilidad de excluir la página no quieren volver a la de almacenamiento en caché en el cliente. Esto podría hacerse mediante el establecimiento de la adecuada respuesta de los encabezados. He aquí un ejemplo con un [NoCache] acción personalizada de filtro que se puede utilizar para decorar la correspondiente acción del controlador.

    • Perfecto!! Muchas gracias!
  2. 6

    En primer lugar, si la página anterior los datos enviados al servidor, la mejor manera de Redirect(...) a otra acción tras el éxito de procesamiento, para evitar que los datos se envíen de nuevo en «Actualizar».

    Luego también en el conjunto de la página a punto de expirar, por lo que el botón de atrás no funciona:

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

    • gracias, llegué a esta respuesta también!
  3. 4

    Estás haciendo la pregunta equivocada. No intente deshabilitar «atrás» en el cliente. Este será condenada al fracaso; usted puede ser capaz de hacer lo más difícil, pero nunca vas a ganar esa lucha. En lugar usted debe re-escribir la página que usted ha dicho que sólo el proceso de la tarjeta de crédito una vez. Usted debe (en el servidor) «recordar» que ha procesado la tarjeta de crédito de modo que si el usuario vuelve a la página para volver a enviarlo usted puede darle a ellos un mensaje de error diciendo «ya ha enviado esta información, usted no puede presentar esta solicitud dos veces».

    Ahora, hay varias formas de lograr este objetivo general, y algunos son mejores que otros, pero ese es el objetivo que usted necesita para encaminarse hacia.

    Una manera de hacer esto es ir a cada página que redirige al usuario a una tarjeta de crédito de forma; justo antes de la presentación de la solicitud de agregar algo a la sesión del usuario (es decir,"pendingCreditCardSubmission" = true) una Vez que enviarla a continuación, comprobar para que la variable de sesión. Si es cierto, enviar la solicitud y la establece en false, si es falso o no, a continuación, enviar un mensaje de error al usuario.

    • Aquí; tienen un uppie en una respuesta anterior!
  4. 2

    Esto es lo que hicimos:

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

    Después de esto se puede implementar en el ámbito general o en el controlador de alcance.

  5. 1

    Ha pasado mucho tiempo desde que este se preguntó, pero mi solución fue agregar el [NoCache] por encima de la WebPageController clase.

     [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()
    }
    };
    }

Dejar respuesta

Please enter your comment!
Please enter your name here