2012-10-19 55 views
9

C#でASP.NET MVCでRazorを使用しています。戻るボタンを無効にする

私は外部のウェブページを呼び出してクレジットカードを処理しています。それは私に戻ります。私は領収書を表示します。

私は前の画面に戻ることを防ぎたいと思います。

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

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

このような状況で戻るボタンをどのように防ぐのですか?

+0

これはこれを行うためのJavaScriptコードです。 C#はすべてのサーバー側であるため、C#はそれとは関係ありません。私はあなたがこれに対する答えのためにStackoverflowを検索することができると確信しています。 [編集:私はあなたのために検索しました。](http://stackoverflow.com/search?q =防止+戻る+ボタン+ブラウザ) – Gromer

+0

また、Razorファイルのセクションを使用する場合は、特定の部分表示レイザーファイルからページにjavascriptを挿入できます。詳細については、このブログをチェックしてください:http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx – Gromer

+0

Can 'これを無視するブラウザではスクリプトを無効にする必要はありませんか? – ErocM

答えて

14

クライアントのキャッシュに戻したくないページを除外することも可能です。これは、適切な応答ヘッダーを設定することによって行うことができます。次に、[NoCache]カスタムアクションフィルタを使用して、対応するコントローラアクションをデコレートする例を示します。

+0

完璧!どうもありがとうございました! – ErocM

6

最初に、前のページがデータをサーバーに送信した場合は、処理が成功した後に別のアクションにRedirect(...)を送信すると、「再読み込み」にデータが再送信されなくなります。

はその後も期限切れになるようにページを設定するので、[戻る]ボタンは機能しません:

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

+0

ありがとう、私もこの答えをチェックアウト! – ErocM

3

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

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

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

+0

ここに。本当に古い答えにuppieを持っている! –

1

これは、我々はそれをやった方法です。この後

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

} 

あなたは一般的な範囲でまたはコントローラのスコープのいずれかでそれを実装することができます。

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() 
      } 
     }; 
    } 
関連する問題