10

ASP.NET MVCでC#を使用してRazorを使用しています。

クレジットカードを処理するために外部のWebページを呼び出していますが、それが返されます。次に領収書を表示します。

前の画面に戻らないようにしたいと思います。

イベントを取得するための.cshtmlファイルであるため、aspのような基礎となるcsページがありません。

このレシートページはビューであるため、JavaScriptを使用するすべてのページに影響するため、ヘッダーにJavaScriptを含めることはできません。

この状況で戻るボタンを防ぐ方法を知っている人はいますか?

4

6 に答える 6

15

1つの可能性は、戻りたくないページをクライアントのキャッシュから除外することです。これは、適切な応答ヘッダーを設定することで実行できます。[NoCache]これは、対応するコントローラーアクションを装飾するために使用できるカスタムアクションフィルターの例です。

于 2012-10-19T16:13:14.780 に答える
7

まず、前のページがサーバーにデータを投稿した場合、Redirect(...)「更新」でデータが再送信されないように、処理が成功した後に別のアクションを実行するのが最善です。

次に、ページの有効期限を設定して、戻るボタンが機能しないようにします。

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

于 2012-10-19T16:14:04.870 に答える
4

あなたは間違った質問をしている。クライアントで「戻る」を無効にしようとしないでください。これは失敗する運命にあります。あなたはそれをより難しくすることができるかもしれません、しかしあなたはその戦いに決して勝つことはありません。代わりに、クレジットカードを一度だけ処理するように、持っている特定のページを書き直す必要があります。クレジットカードを処理したことを(サーバー上で)「覚えて」おく必要があります。これにより、ユーザーがページに戻って再送信した場合に、「この情報を既に送信している場合は、できません」というエラーメッセージを表示できます。このリクエストを2回送信してください。」

さて、この一般的な目標を達成するためのいくつかの方法があり、いくつかは他よりも優れていますが、それはあなたが目指す必要のある目標です。

これを行う1つの方法は、ユーザーをこのクレジットカードフォームにリダイレクトするすべてのページに移動することです。リクエストを送信する直前に、そのユーザーのセッションに何かを追加します(つまり、ユーザーが"pendingCreditCardSubmission" = trueそのリクエストを送信したら、そのセッション変数を確認します。trueの場合、リクエストを送信してfalseに設定し、falseの場合、または存在しない場合は、ユーザーにエラーメッセージを送信します。

于 2012-10-19T16:44:10.457 に答える
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;
    }

}

この後、一般スコープまたはコントローラースコープのいずれかに実装できます。

于 2013-09-30T19:13:47.860 に答える
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()
            }
        };
    }
于 2016-08-09T18:32:21.033 に答える
0

MVC aspnetフレームワークでは、次のことを選択できますRedirectToActionPermanent

次に、ブラウザに301応答コードを通知します。

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

于 2021-04-29T23:50:39.977 に答える