ASP.NET MVC - TempData - 好的或坏的做法

时间:2008-12-22 16:30:13

标签: asp.net-mvc tempdata

我正在使用Scott Gu的Preview 5博客文章中详述的AcceptVerbs方法来处理ASP.NET MVC中的表单条目:

  • 用户通过GET获取空表单
  • 用户通过POST将填好的表单发布到相同的操作
  • 操作验证数据,采取适当的操作,并重定向到新视图

所以我不必使用TempData。也就是说,我现在必须在此过程中添加“确认”步骤,似乎需要使用TempData

出于某种原因,我厌恶使用TempData - 它是一种可以设计的东西。

这完全是一个有效的问题,还是我在弥补?

8 个答案:

答案 0 :(得分:76)

无需厌恶TempData ......但如果使用不当,肯定会表明设计不佳。如果您使用RESTful URL,则TempData是将POST操作中的消息传输到GET操作的最佳实践。考虑一下:

您在URL Products / New有一个表单。表单发布到产品/创建,验证表单并创建产品,成功时控制器重定向到URL Products / 1,出错时会重定向回产品/新建以显示错误消息。

Products / 1只是产品的标准GET操作,但我们希望显示一条消息,指示插入成功。 TempData非常适合这种情况。将消息添加到Post Controller中的TempData,并在视图中放置一些if逻辑并完成。

失败时,我一直在postFollection中添加输入的值,并在Post Action中添加错误消息到TempData,并重定向到初始Action Prodcuts / New。 我在视图中添加了逻辑,用以前输入的值和任何错误消息填充表单输入。对我来说看起来很干净!

答案 1 :(得分:31)

我认为你在使用TempData之前犹豫不决。 TempData存储在会话中,如果出现以下情况,这可能会对您产生影响:

  1. 您现在不在自己的网站上使用会话
  2. 您的系统需要扩展到高吞吐量,即您希望完全避免会话状态
  3. 你不想使用cookies(我不知道MVC现在支持无cookie会话的程度如何)
  4. 如果您的网站需要具备高可用性,那么在应用会话状态方面还有其他注意事项,但这些都是可解决的问题。

答案 2 :(得分:25)

我认为临时数据是用于通知用户的“即发即忘”机制。很高兴能让他们提醒他们最近做过的事情,但我也犹豫是否要在某些用户流程中采取必要步骤。原因是如果他们刷新页面,我相信它会消失。嗯,我想我也犹豫是否使用它,因为它没有真正明确的可靠性。

我想知道问题是您是否在确认步骤之前将操作重定向到另一个页面。我想知道在他们第一次提交之后,你可以做足够的处理来生成确认对话框,然后返回带有确认问题的原始页面。与验证方法类似,但验证规则检查是否执行了确认步骤(确认UI隐藏,直到其他验证通过)。

答案 3 :(得分:3)

我有一个GetModel方法,它首先检查TempData [“model”]并返回它。否则GetModel从数据库加载适当的数据。

当我有一个需要返回需要相同模型数据的不同视图的操作时,它会从数据库中节省额外的负载。

答案 4 :(得分:3)

在MVC3中查看sessionless controllers。事实证明,使用会话可以防止并行执行单个用户的请求,从而导致性能下降。

由于tempdata默认使用会话,因此您将无法使用此功能。你可以切换到使用饼干tempdata,但它有点尴尬(至少对我而言)。但是,仍然比视野更清洁,所以也许它不是一个如此大的破坏者。

答案 5 :(得分:2)

这就像使用ViewData一样,这意味着它可能不是安全风险。但我宁愿使用ViewData而不是TempData。点击这里查看比较组:http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

根据设计的不同,您可以随时在数据库的tempdata中存储用户/购物篮或者您需要的内容,并且只有一个“IsReady”字段,指示其是否已完成,如果您愿意,可以在以后进行扩展请记住,人们可以关闭他们的浏览器。

答案 6 :(得分:2)

你为什么会这样厌恶?这件事只是让自己的工作变得更好:)

如果您因为非强类型而不喜欢它,您可以随时创建一个包装器,它将为您提供强类型接口。

答案 7 :(得分:0)

所有好的答案,你有没有看过这个传递信息。

TempData和Session不是RESTful架构的最佳选择,因为大多数会话都存储在内存中。因此,当您想要使用服务器场时,用户会话将存在于一台服务器上,而下一个请求可能会被发送到另一台服务器。

有人说看看TempData在这里传递消息的用法。

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

Mabye如果仅用于重定向到另一个页面警报,则可以使用查询字符串方法。