发布/重定向/获取 - 刷新时保持不变

时间:2015-03-10 16:37:48

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

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

我想使用PRG模式,所以在提交后如果刷新页面,你就不会被问到“你确定blabla ...'。

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

public ActionResult RedirectToPreview(DemandLetterModel model)

和     public ActionResult PreviewLetters(DemandLetterModel model)

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

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

在PreviewLetters中,我有:

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

它可以工作,但是当你刷新页面时,由于tempdata它不再有效。我该怎么做?我宁愿没有会话,因为它增加了复杂性。

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

2 个答案:

答案 0 :(得分: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。您重定向到的操作应该检索它需要的任何内容。它应该能够独立于是否被重定向到你的后期行动或仅仅是自己请求而运作。

答案 1 :(得分:0)

Post / Redirect / Get Pattern可以解决重复POST问题。 它可以阻止两次提交付款等事情。

它无意避免浏览器对话,并且不应该为所有POST遵循规则。

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

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

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

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

来指定要保留的密钥

注意
TempData是会话支持的,所以你仍然使用Session,它只是隐藏