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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (244)

我正试图获得MVC框架的支持,所以忍受着我。

现在,我使用会话存储的唯一方法是存储当前登录的用户。我的网站很简单。对于这个例子,考虑三个域对象,Person,Meeting和File。用户可以登录并查看会议的“仅限会员”配置文件,并可以向其添加文件,或查看会议的公开“配置文件”(如果未登录)。

因此,从会议的私人档案中,通过登录用户,我有一个“添加文件”链接。此链接路由到FileContoller.Add(int meetingId)。从这个动作中,我得到了用户想要使用会议ID添加文件的会议,但在发布表单后,我仍然需要知道用户正在将文件添加到哪个会议。这就是我的问题所在,我应该通过TempData传递“正在与之交互”的会议,还是将其添加到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是会话,所以它们并没有完全不同。但是,区别很容易理解,因为TempData仅用于重定向,并且仅用于重定向。所以当你在TempData中设置一些消息然后重定向时,你正确地使用了TempData。

但是,将Session用于任何类型的安全性是非常危险的。会话和成员资格在ASP.NET中完全分离。你可以从其他用户那里“窃取”会话,是的,人们以这种方式攻击网站。因此,如果您希望根据用户是否登录来选择性停止发布信息,请查看IsAuthenticated,并且如果要根据登录的用户类型选择性显示信息,请使用角色提供程序。因为可以缓存GET,所以有选择地允许访问GET中的操作的唯一方法是使用AuthorizeAttribute。

用户回答回答于

默认的TempData提供程序使用会话,所以除了在下一个请求结束时清除TempData之外,没有太大区别。当数据只需要在两个请求之间保留时,应该使用TempData,最好是第二个是重定向,以避免用户的其他请求出现问题 - 例如,来自AJAX--意外删除数据。如果数据需要持续更长时间,则应该重新填充TempData或直接使用Session。

扫码关注云+社区

领取腾讯云代金券