asp.net-mvc - 何时在 ASP.Net MVC 中使用 TempData 与 Session

标签 asp.net-mvc session tempdata

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

现在,我使用 session 存储的唯一目的是存储当前登录的用户。我的网站很简单。对于此示例,请考虑三个域对象:人员、 session 和文件。用户可以登录并查看 session 的“仅限成员(member)”个人资料,并可以向其中添加文件,或者在未登录的情况下查看 session 的公共(public)“个人资料”。

因此,从 session 的私有(private)个人资料中,对于登录的用户,我有一个“添加文件”链接。此链接路由至 FileContoller.Add(int meetId)。通过此操作,我可以使用 session ID 获取用户想要添加文件的 session ,但在发布表单后,我仍然需要知道用户要将文件添加到哪个 session 。这就是我的问题所在,我应该通过 TempData 传递“当前正在交互”的 session ,还是将其添加到 Session 存储中?

这就是我当前进行添加操作设置的方式,但它不起作用:

    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 中应存储哪种数据(消息除外)的示例吗?

最佳答案

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

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

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

关于asp.net-mvc - 何时在 ASP.Net MVC 中使用 TempData 与 Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1500402/

相关文章:

asp.net-mvc - 我们可以在asp.net MVC 中从另一个 Controller 调用 Controller 的方法吗?

javascript - 页面加载时折叠侧边栏

PHP: session 的替代品

php - 人们曾经使用过variable.php 文件吗?

javascript - Laravel session 存储 jquery

asp.net-mvc - ASP.NET MVC - TempData - 好的或坏的实践

asp.net-mvc - TempData ["sth"] 作为 bool 值

jquery - 如何手动关闭 Kendoui 弹出窗口

javascript - 使用 ajax 返回 Controller 方法值

java - org.hibernate.exception.GenericJDBCException : Cannot open connection