2

ASP.NET MVC 3 を使用した非常に単純な 1 ページのフォームがあります。

3つの入力があります。ユーザーが正しい入力を入力し、データベースが pdf を取得すると、その pdf が次のページに表示されます。このシナリオで可能な限り、PRG パターンを使用しました。

public ActionResult Index()
{
  SomeModel model = new SomeModel
  {
    ... properties
  };

  return View(model);
}

[HttpPost]
public ActionResult Index(SomeModel model)
{
  byte[] blob = someService.GoGetDetails(model);
  TempData.Add("blobkey", blob);

  return RedirectToAction("DisplayPdf");
}

public ActionResult DisplayPdf()
{
    return File(TempData["blobkey"] as byte[], "application/pdf");
}

問題のユースケースは次のとおりです。ユーザーが間違った詳細を入力し、[送信] ボタンをクリックします。赤のエラー テキストが表示されます。次に、ユーザーは正しい詳細を入力し、[送信] ボタンをクリックします。Pdf が表示されます。ユーザーTHENは戻るボタンを押します。以前の赤いエラー テキストが表示されたフォームが表示されます。

テスターは、戻るボタンがクリックされたときに赤いテキストが表示されないようにするという要件を設定しました。

簡単そうです。試すまで。誰もがこれのための魔法の弾丸を持っていますか.

妥協案として試したことが 1 つうまくいきませんでした。つまり、DisplayPdf アクション メソッド内で次のコードを使用して、ブラウザーのキャッシュを強制終了しようとしました。

        this.ControllerContext.HttpContext.Response.Expires = 60;
        this.ControllerContext.HttpContext.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
        this.ControllerContext.HttpContext.Response.AddHeader("pragma", "no-cache");
        this.ControllerContext.HttpContext.Response.CacheControl = "no-cache";

効果はありません。おそらく、それは Web フォームの世界で機能します。FileResult ではありません。

戻るボタンを押すと、サーバーへのリクエストはありません。それはすべてクライアント側です。だから、私はjavascriptにアクセスできます。しかし、javascript は http ヘッダーにアクセスできないため、ページが読み込まれた場所を区別する方法はありません。

これが以前に解決されたかどうかを知りたいです。私のグーグルは空になりました。

ありがとう

4

1 に答える 1

1

わかった。今は満足しています。もしも :

  • Amazon.co.jp
  • JsFiddle.net
  • Outlook.com
  • Dropbox.com

すべてが同じ動作を示す場合、私の作業はベスト プラクティスに達していません。

ブラウザーのナビゲーション ボタンを傍受することは、私には非常にハックに思えます。これは、ユーザーがばかげたことをしたときにコードが損傷しないようにする必要があるユースケースの 1 つです。しかし、エレガントに解決しますか?ブラウザによって制御が奪われた場合、おそらく大きなドライバーではありません。

于 2013-04-29T23:53:27.547 に答える