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);
}
换句话说,不需要TempData
或Session
。您重定向到的操作应该检索它需要的任何内容。它应该能够独立运行,无论它是从您的 post 操作重定向到还是仅由其自身请求。
我有主页,由一些复选框组成。用户必须标记其中的一些,然后提交。从那里,我向数据库发出一些请求,然后提取一些数据,然后将其显示给用户。
我想使用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);
}
换句话说,不需要TempData
或Session
。您重定向到的操作应该检索它需要的任何内容。它应该能够独立运行,无论它是从您的 post 操作重定向到还是仅由其自身请求。