我在MVC项目中使用了PRG模式()。这样做的想法是,您不从操作中返回视图,而是在一个成功的帖子中,您将完全重定向到另一个视图,该视图可以获取保存的值并重新显示它们(例如“保存成功”页面)。
在我的例子中,我没有一个数据库来保存保存的详细信息,我想知道一种可靠的存储方式,然后在下一页获取保存的详细信息。
我在做
RedirectToAction("Success", myViewModel)我理解这是错误的,尤其是因为它在地址栏中有所有的值。我需要做的是
RedirectToAction("Success")然后以某种方式将值取回来,构建一个视图模型并将其提供给视图。
我知道有ViewBag、TempData、ViewData和Session,但是在不同的场景中没有进行大量的测试,我不知道在我的情况下应该使用哪一种。静力学显然对一个面向公众的网站没有好处。
如果您在没有数据库的情况下执行PRG,那么如何持久化这些数据?或者,如果用户返回和转发,我可以抛出某种错误&重定向吗?
在此之前,非常感谢您。
编辑:示例场景-汽车保险。用户访问网站,填写个人详细信息和点击提交。在下一页中,将提供选项(第三方、盗窃、自愿超额等),并在选择这些选项时通过AJAX进行调用以获得报价。
所有的个人信息都会随选项一起发送。但没有用户帐户,也没有任何东西被写入数据库(数据保护法-我们不存储数据,除非获得许可,并询问将推迟人们,如果他们只是浏览)。
更新:我们确定的解决方案如下: Details POST操作构建了一个OptionsViewModel。它被放入TempData中。RedirectToAction("Options")被调用。在选项操作中,我们得到了视图模型。
OptionsViewModel viewModel = (OptionsViewModel)TempData.Peek("MyViewModel"); // .Peek preserves the value如果视图模型为null,我们将RedirectToAction()返回到Details。否则,我们返回Options视图。
发布于 2015-08-08 01:58:01
除了它创建的丑陋查询字符串之外,RedirectToAction("Success", myViewModel)可能失败,因为(1)您可能超过查询字符串限制(这将引发异常)或(2)如果您的模型包含复杂对象或集合的属性,那么这些属性将是GET方法中的null。
ViewBag和ViewData不适合在方法之间传递值-它们用于将数据从控制器传递到视图(参见这篇文章)。
不清楚为什么您没有某种类型的永久存储,但是没有它,您将需要TempData或Session来临时存储请求之间的数据。
TempData使用Session,但它只持续一个请求,因此如果您使用它将模型传递给Success()方法,并且用户刷新浏览器,则模型将是null,尽管您可以使用.Peek或.Keep覆盖该行为(参见这个问题/答案)。
就我个人而言,我从不使用Session (而且只使用TempData传递非关键数据,例如一次表示成功的消息),并且会考虑将数据保存在某个地方,例如,在重定向之前将数据保存到xml文件中,以便在GET方法中再次读取。
https://stackoverflow.com/questions/31882432
复制相似问题