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 显示。用户然后点击后退按钮。表单显示之前的红色错误文本可见。

测试人员提出了一个要求,即单击后退按钮时不应出现红色文本。

似乎很容易。直到你尝试。有没有人有这方面的灵丹妙药。

我作为妥协尝试的一件事没有奏效。也就是说,我尝试在 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";

它没有效果。也许这适用于网络表单世界。FileResult 不在这里。

当点击后退按钮时,没有对服务器的请求。这都是客户端。所以,我确实可以访问 javascript。但是 javascript 无法访问 http 标头,因此无法区分页面的加载位置。

我很想看看以前是否已经解决了这个问题。我的谷歌搜索是空的。

谢谢

4

1 回答 1

1

好的。我现在很满意。如果 :

  • 亚马逊网站
  • JsFiddle.net
  • Outlook.com
  • Dropbox.com

都表现出相同的行为,那么我的工作并不缺乏最佳实践。

截取浏览器的导航按钮对我来说似乎很 hacky。这是一个用例,我们必须确保当用户做愚蠢的事情时我们的代码不会损坏。但优雅地解决?当浏览器从您手中夺走控制权时,可能不是一个大驱动因素。

于 2013-04-29T23:53:27.547 回答