Post/Redirect/Get - 刷新时保持

Post/Redirect/Get - persist when refresh

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

我想使用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");

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

我是否可以仅为该刷新缓存此数据?有什么方法可以解决吗?

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

它不是为了避免浏览器对话,也不应该成为所有 POST 都必须遵守的规则。

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

TempData 项仅在阅读后删除。
当一个键被标记为保留时,该键将被保留用于下一个请求。

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

您可以通过指定 TempData.Keep("key")

来指定要保留的键

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

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

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 操作重定向到还是仅由其自身请求。