MVC PRG模式-传递模型

胜利军刀

我在MVC项目中使用PRG模式(Post-Redirect-Get)。这个想法是,您不会从操作中返回视图,而是在成功的POST上完全重定向到另一个视图,该视图完全执行Get(可能在数据库上)以取回保存的值并重新显示它们(例如,“保存成功”页面)。

就我而言,我没有数据库来保存已保存的详细信息,并且我想知道一种可靠的方式来存储并在下一页获取已保存的详细信息。

我在做

RedirectToAction("Success", myViewModel)

我理解这是错误的,不仅因为它具有URL栏中的所有值。我需要做的是

RedirectToAction("Success")

然后以某种方式取回值,构建视图模型并将其提供给视图。

我知道有ViewBag,TempData,ViewData和Session,但是在各种情况下都没有进行大量测试,我不知道哪种情况适合我的情况。静态信息显然对面向公众的网站不利。

如果您在没有数据库的情况下进行PRG,则持久化数据的方法是什么?或者,如果用户确实来回前进,我是否可以简单地引发某种错误并重定向?

提前谢谢了。

编辑:示例方案-汽车保险。用户访问网站,填写个人详细信息,然后单击“提交”。在下一页上将显示选项(第三方,盗窃,自愿超额等),并在选择它们时通过AJAX致电以获取报价。

所有个人详细信息都与选项一起发送。但是没有用户帐户,也没有任何内容写入数据库(《数据保护法》-除非获得许可,否则我们不存储数据,如果有人浏览,询问将使他们离开)。

更新:我们确定的解决方案如下:详细信息POST操作将构建OptionsViewModel。它被放入TempData中。调用RedirectToAction(“ Options”)。在Options动作中,我们得到了viewmodel

OptionsViewModel viewModel = (OptionsViewModel)TempData.Peek("MyViewModel"); // .Peek preserves the value

如果viewmodel为null,我们将RedirectToAction()返回到Details。否则,我们将返回“选项”视图。

用户名

除了它创建的难看的查询字符串外,它RedirectToAction("Success", myViewModel)可能会失败,因为(1)您可能会超出查询字符串的限制(这将引发异常),或者(2)如果您的模型包含的属性是复杂的对象或集合,则这些属性将null位于GET方法。

ViewBag并且ViewData不适用于在方法之间传递值-它们用于将数据从控制器传递到视图(请参阅本文

它不清楚为什么你没有某种永久存储,但是没有它,你将需要要么TempDataSession临时存储数据的请求之间。

TempData使用,Session但它只会持续一个请求,因此,如果使用它将模型传递给Success()方法,并且用户刷新浏览器,则模型将是null,尽管您可以使用.Peek.Keep覆盖该行为(请参阅此问题/答案)。

就我个人而言,我从不使用Session(并且仅TempData用于传递非关键数据,例如表示成功的一次性消息),并且会考虑将数据持久化到某个地方,例如在重定向之前保存到xml文件中,以便可以在GET方法中再次读取它。 。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章