【问题标题】:Post/Redirect/Get - persist when refresh发布/重定向/获取 - 刷新时保持
【发布时间】:2015-03-10 16:37:48
【问题描述】:

我有主页,由一些复选框组成。用户必须标记其中一些,然后提交。从那里,我向 DB 发出一些请求,然后提取一些数据,然后将其显示给用户。

我想使用 PRG 模式,所以提交后如果刷新页面,就不会问你'are you sure blabla...'。

在我的 ASP.NET MVC 代码中,我有 2 种方法:

public ActionResult RedirectToPreview(DemandLetterModel model)

和 public ActionResult PreviewLetters(DemandLetterModel 模型)

RedirectToPreview 向 DB 发出请求并取回数据,然后将它们放在 tempdata 上,如下所示:

TempData["Notices"] = EligibleNotices.GetListOfNotices(notices);
TempData["Letters"] = letters;

在 PreviewLetters 中,我有:

ViewBag.Notices = TempData["Notices"];
ViewBag.Letters = TempData["Letters"];
return View("Preview");

它可以工作,但是当您刷新页面时,由于临时数据,它不再工作。我该怎么做?我更喜欢没有会话,因为它增加了复杂性。

我可以只为刷新缓存这些数据吗?有没有办法解决这个问题?

【问题讨论】:

  • 仅供参考 - TempData 由 Session 支持
  • 看起来你不是在重定向...
  • 不确定您为什么不想使用 Session。它与 TempData 相同。还知道 TempData 仅“幸存” 1个重定向。 ViewBag 只存在一个视图。不是 100% 肯定,但也许你的问题是 TempData 在“刷新”后不再有效(看起来像重定向)。我可以建议以下两者之一: 1. 存储在会话中。 (仅当会​​话为空时才调用数据库) 2. 使用缓存。

标签: c# asp.net-mvc redirect post get


【解决方案1】:

要遵循的正确程序如下所示:

public ActionResult Foo()
{
    return View();
}

[HttpPost]
public ActionResult Foo(Foo model)
{
    if (ModelState.IsValid)
    {
       // save to database or whatever
       return RedirectToAction("Bar");
    }

    return View(model);
}

public ActionResult Bar()
{
    // retrieve model from database
    return View(model);
}

换句话说,不需要TempDataSession。您重定向到的操作应该检索它需要的任何内容。它应该能够独立运行,无论它是从您的发布操作重定向到的,还是仅由它自己请求。

【讨论】:

  • 如何让用户知道 POST 是否成功?
  • “栏”将是您的“成功”页面。或者,您可以使用 TempData 来包含您将独立呈现的某种成功消息。
  • 在“栏”页面中,如果 GET 是由用户直接请求或发布请求,您有何不同?因为在我看来,如果您不想使用TempDatadatabase,那么您需要另一个成功页面。例如 GetFormPage、PostFormPage、GetSuccessPage 还是我错过了什么?
  • 通常,您的获取和发布视图是相同的。无论哪种方式,您都想显示表单:用户要么是第一次填写,要么犯了某种需要更正的错误。然后,您将拥有一个成功视图,当用户成功完成表单时将加载该视图。但是,这确实意味着三个操作:一个用于获取表单,一个用于处理帖子,并在错误时返回视图或在成功时重定向,最后是您的“成功”操作,该操作将发布操作重定向到并加载成功视图.
【解决方案2】:

Post/Redirect/Get Pattern 用于解决重复 POST 问题。 它会阻止诸如付款之类的事情被提交两次。

这不是为了避免浏览器对话,也不应该是所有 POST 都遵循的规则。

话虽如此,如果你坚持这样做,有TempData.Keep();

TempData 项目只有在被读取后才会被删除。
当一个密钥被标记为保留时,该密钥被保留用于下一个请求。

只需在重定向前调用TempData.Keep()

您可以通过指定 TempData.Keep("key") 来指定要保留的键

注意
TempData 受会话支持,因此您仍在使用 Session,它只是被隐藏了

【讨论】:

  • 我不同意。 PRG 是任何 POST 都遵循的好模式。不确定您可能会想到什么异常,但即使在用户刷新时可以重播相同的 POST 的情况下,这样做仍然是不好的做法。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
相关资源
最近更新 更多