当在ASP.Net MVC使用的TempData VS会议(When to use TempData

2019-07-20 07:30发布

我试图让MVC框架的窍门所以大家多多包涵。

现在,我使用的会话存储的唯一事情是存储登录用户的电流。 我的网站是简单的。 在这个例子中,考虑三个域对象,人,会议和文件。 用户可以登录系统,查看会议的“成员只有”配置文件,可以将文件添加到它,或查看会议的公开的“个人资料”,如果他们还没有登录。

所以,从会议的专用配置文件,以登录的用户,我有一个“添加文件”链接。 此链接路线FileContoller.Add(INT meetingId)。 从这个动作,我得到了用户想要将文件添加到使用会议ID的会议,但形式发布后,我还需要知道用户将文件添加到会议。 这就是我的问题所在,我应该通过,通过TempData的会议“目前正在与互动”,或将其添加到会话存储?

这是我目前拥有的添加操作设置,但它不工作:

    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的VS会话的例子?

Answer 1:

TempData的是会话,因此他们不是完全不同。 然而,这种区分是很容易理解,因为TempData的是重定向,只有重定向 。 所以,当你设置TempData的一些消息,然后重定向,使用方法正确的TempData。

然而,使用会话任何类型的安全是极其危险的。 会话和成员在ASP.NET完全独立的。 您可以从其他用户的“偷”的会议 ,是的,人做攻击网站的这种方式。 所以,如果你希望有选择地阻止根据用户是否登录后的信息,看IsAuthenticated ,如果你想根据记录在什么类型的用户选择显示的信息,您可以使用一个角色提供商 。 由于获取可以被缓存,有选择地允许访问一个GET行动的唯一途径是AuthorizeAttribute。

更新在回答您的问题编辑:你已经在你的问题使用TempData的,即,一个失败的POST返回后,一个简单的错误消息的一个很好的例子。 在什么应该被存储在会话方面(超越“并不多”),我只是觉得会议作为用户特定的缓存。 像非用户特定的缓存,你不应该把有安全敏感信息。 但它是一个好地方坚持的东西是查找相对昂贵。 例如,我们的Site.Master上有显示的用户的全名。 存储在数据库中,我们不想做一个数据库查询它为我们所服务的每一个页面。 (我们的应用程序的安装在一个单一的公司使用,所以用户的全名不被认为“安全敏感”。)所以,如果你认为会议作为由用户有一个cookie变化的缓存,你赢了” T为远矣。



Answer 2:

默认TempData的提供商使用会话所以真的是没有太大的区别,只是你的TempData在下一请求结束清除出去。 从AJAX,例如 - - 删除数据时意外的数据只需要两个请求,最好是第二种是重定向以避免与用户的其他请求之间的问题要坚持你应该使用TempData的。 如果数据需要持续更久,您应该重新填充到TempData或直接使用会话。



Answer 3:

“它不工作”是不是很描述性的,但让我提供了几个建议。

引擎盖下,TempData的使用会话存储值。 因此,有没有在存储机制之类的东西而言太大的区别。 不过,TempData的只持续,直到接收到一个请求。

如果用户在表单岗位之间一个Ajax请求,TempData的走了。 任何请求任何将清除的TempData。 因此,它真的只有可靠的,当你做一个手动重定向。

为什么你不能只是简单的呈现在你的浏览形式的会议ID的隐藏字段? 你已经将它添加到模型。 或者,将其添加到作为参数路线。



Answer 4:

您可以使用它按您的要求。 一个澄清就可以了,

TempData的 会话 Vs的

TempData的

  1. TempData的使我们能够为单个后续请求期间保存数据。
  2. ASP.net MVC将自动失效TempData的价值一度连续请求返回的结果(这意味着,它活着只能做到目标的观点是完全加载)。
  3. 它仅对只有当前和后续请求
  4. TempData的具有保存方法自留TempData的价值。

    例:

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

  5. TempData的内部存储到会话变量的值。

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

会议:

  1. 会话能够存储的数据更长时间,直到用户会话不会过期。
  2. 会议将在到期后的会话超时发生。
  3. 它适用于所有请求。
  4. N / A
  5. 会议varible存储在SessionStateItemCollection对象(这是通过页面的HttpContext.Session属性公开)。
  6. 它用于如:用户ID,角色ID等存储寿命长数据,需要在整个用户会话。

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



Answer 5:

我宁愿保持那种在页面本身的数据。 渲染meetingID作为一个隐藏的输入,所以它被提交给控制器。 然后处理后的控制器能够养活该会议ID回任何视图将被渲染,使meetingID基本上被周围,只要你需要它传递。

这有点像调用,将在其上运行的方法之前存储在一个全局变量的值,与直接传递价值的方法之间的差异。



Answer 6:

我建议MvcContrib的解决方案: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

如果你不想完全MvcContrib,解决办法只有1方法+ 1类,您可以轻松地从MvcContrib来源抢。



Answer 7:

该TempData的属性值存储在会话状态。 TempData的价值仍然存在,直到它被读取或直到会话超时。 如果你想传递数据的一个控制器视图到另一个控制器视图,那么你应该使用TempData的。

使用会话时所需的数据,为整个应用程序



文章来源: When to use TempData vs Session in ASP.Net MVC