Asp.net-Mvc

何時在 ASP.Net MVC 中使用 TempData 與 Session

  • September 30, 2009

我正在嘗試掌握 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 vs Session 中儲存哪種數據(消息除外)?

TempData 是會話,所以它們並不完全不同。但是,區別很容易理解,因為TempData 用於重定向,並且僅用於重定向。因此,當您在 TempData 中設置一些消息然後重定向時,您正在正確使用 TempData。

但是,將 Session 用於任何類型的安全性都是極其危險的。會話和成員資格在 ASP.NET 中是完全分開的。您可以“竊取”其他使用者的會話,是的,人們確實以這種方式攻擊網站。因此,如果您想根據使用者是否登錄選擇性地停止發布資訊,請查看IsAuthenticated,如果您想根據登錄的使用者類型選擇性地顯示資訊,則使用Role provider。因為 GET 可以被記憶體,所以選擇性地允許訪問 GET 中的操作的唯一方法是使用 AuthorizeAttribute。

更新響應您編輯的問題:您已經有一個在問題中使用 TempData 的好例子,即在失敗的 POST 後返回簡單的錯誤消息。在應該做什麼方面被儲存在 Session 中(除了“不多”),我只是認為 Session 是一個使用者特定的記憶體。像非使用者特定的記憶體一樣,您不應該將安全敏感資訊放在那裡。但這是一個放置查找成本相對較高的東西的好地方。例如,我們的 Site.Master 上面顯示了使用者的全名。它儲存在數據庫中,我們不想為我們服務的每個頁面都進行數據庫查詢。(我們的應用程序安裝在一家公司中使用,因此使用者的全名不被認為是“安全敏感的”。)因此,如果您將 Session 視為隨使用者擁有的 cookie 而變化的記憶體,您將不會大錯特錯。

引用自:https://stackoverflow.com/questions/1500402