首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时在ASP.Net MVC中使用TempData vs Session

何时在ASP.Net MVC中使用TempData vs Session
EN

Stack Overflow用户
提问于 2009-09-30 20:14:21
回答 7查看 80.3K关注 0票数 67

我正在尝试掌握MVC框架的诀窍,所以请耐心等待。

现在,我使用会话存储的唯一目的就是存储当前登录的用户。我的网站很简单。在本例中,考虑三个域对象: Person、Meeting和File。用户可以登录并查看会议的“仅限成员”配置文件,还可以向其中添加文件,或者在未登录的情况下查看会议的公共“配置文件”。

因此,从会议的私人配置文件中,通过登录的用户,我有一个“添加文件”链接。此链接路由到FileContoller.Add(int meetingId)。通过这个操作,我得到了用户想要使用会议id添加文件的会议,但是在表单发布之后,我仍然需要知道用户正在向哪个会议添加文件。这就是我的问题所在,我应该通过TempData传递“当前正在交互的”会议,还是将其添加到会话存储中?

这就是我目前设置的添加操作,但它不起作用:

代码语言:javascript
复制
    public ActionResult Add(int meetingId)
    {
        try
        {
            var meeting = _meetingsRepository.GetById(meetingId);
            ViewData.Model = meeting;
            TempData[TempDataKeys.CurrentMeeting] = meeting; /* add to tempdata here */
        }
        catch (Exception)
        {
            TempData[TempDataKeys.ErrorMessage] = "Unable to add files to this meeting.";
            return RedirectToRoute("MeetingsIndex");
        }

        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Add(FormCollection form)
    {
        var member = Session[SessionStateKeys.Member] as Member;
        var meeting = TempData[TempDataKeys.CurrentMeeting] as Meeting; /* meeting ends up null here */

        if (member == null)
        {
            TempData[TempDataKeys.ErrorMessage] = "You must be logged in to add files to an meeting.";
            return RedirectToRoute("LoginPage");
        }

        if (meeting == null) 
        {
            TempData[TempDataKeys.ErrorMessage] = "An error occurred. No meeting selected.";
            return RedirectToRoute("MeetingsIndex");
        }

            // add files to meeting

        TempData[TempDataKeys.Notification] = "Successfully added.";
        return RedirectToRoute("AddFiles", new {meetingId = meeting.MeetingId});
}

编辑:

根据大多数答案,有没有人能提供一些例子,说明应该在TempData与Session中存储哪些类型的数据(消息除外)?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-30 20:31:04

TempData是会话,所以它们并不是完全不同的。但是,这种区别很容易理解,因为TempData is for redirects, and redirects only。因此,当您在TempData中设置一些消息,然后重定向时,您正确地使用了TempData。

然而,将会话用于任何类型的安全性都是极其危险的。在ASP.NET. You can "steal" sessions from other users中,会话和成员资格是完全分开的,是的,人们确实会以这种方式攻击网站。因此,如果您希望根据用户是否登录来有选择地停止发布信息,请查看IsAuthenticated;如果您希望根据登录的用户类型有选择地显示信息,则可以使用Role provider。因为GET可以被缓存,所以有选择地允许访问GET中的操作的唯一方法是使用AuthorizeAttribute。

更新来回答您编辑过的问题:您已经有了一个在您的问题中使用TempData的很好的示例,即在POST失败后返回一条简单的错误消息。至于会话中应该存储的内容(除了“不多”之外),我只是认为会话是一个特定于用户的缓存。就像非特定于用户的Cache一样,您不应该将安全敏感信息放在那里。但这是一个粘贴东西的好地方,这些东西查找起来相对昂贵。例如,我们的Site.Master上显示了用户的全名。它存储在数据库中,我们不想为我们提供的每个页面都对它进行数据库查询。(我们应用程序的安装是在一家公司中使用的,因此用户的全名不被认为是“安全敏感的”。)因此,如果您认为会话是一个缓存,它随用户拥有的cookie而变化,那么您就不会大错特错。

票数 98
EN

Stack Overflow用户

发布于 2009-09-30 20:27:44

缺省的TempData提供程序使用会话,所以除了TempData在下一个请求结束时被清空之外,实际上没有太多区别。当数据只需要在两个请求之间持久化时,您应该使用TempData,第二个请求最好是重定向,以避免用户的其他请求--例如来自AJAX的--意外删除数据时出现问题。如果数据需要保存的时间超过此时间,则应重新填充TempData或直接使用会话。

票数 17
EN

Stack Overflow用户

发布于 2017-06-22 15:07:28

您可以根据需要使用它。澄清可以是,

TempData Vs Session

TempData

request.

  • ASP.net MVC会在连续的请求返回结果时自动终止only

  • TempData的值(这意味着,它只在目标视图完全加载之前是活的)

  • 它只对当前和后续的请求有效only

  • TempData有Keep方法来保留TempData的值。

示例:

TempData.Keep(),TempData.Keep(“EmpName”)

  • TempData在内部将值存储到会话变量。

  • 它仅用于存储一次消息,如验证消息、错误消息等。

会话:

page可以存储更长时间的数据,直到用户session不存在expire.

  • Session才会在session超时后过期。

  • 它对所有页面有效的变量都存储在SessionStateItemCollection对象中(通过

  • 的HttpContext.Session属性公开)。

  • 它用于存储整个用户session过程中需要的用户id、角色id等长生命周期数据。

TempData和session,都需要类型转换来获取数据并检查空值,以避免运行时异常。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1500402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档