ProgramingTip

ASP.Net MVC에서 TempData 대 세션을 사용하는 경우

bestdevel 2020. 12. 4. 19:49
반응형

ASP.Net MVC에서 TempData 대 세션을 사용하는 경우


나는 MVC 프레임 워크의 요령을 얻으려고 노력하고 있으므로 나를 참 아라.

지금 당장 세션 저장소를 사용하는 유일한 것은 현재 로그인 한 사용자를 저장하는 것입니다. 내 웹 사이트는 간단합니다. 이 예에서는 Person, Meeting 및 File의 세 가지 도메인 개체를 고려하십시오. 사용자는 회의의 "회원 전용"프로필에 로그인하여 볼 ​​수 및 파일을 추가하거나 로그인하지 않은 경우 회의의 공개 "프로필"을 볼 수 있습니다.

따라서 로그인 한 사용자가있는 회의의 비공개 프로필에서 "파일 추가"링크가 있습니다. 이 링크는 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 대 세션에 어떤 종류의 데이터 (제외)를 저장해야합니까?


TempData는 세션이므로 완전히 다르지 않습니다. 그러나 TempData는 리디렉션 용이고 . 따라서 TempData에서 일부 메시지를 설정 한 다음 리디렉션하면 TempData를 올바르게 사용하는 것입니다.

그러나 세션을 사용하는 것은 매우 위험합니다. 세션과 멤버십은 ASP.NET에서 완전히 분리되었습니다. 다른 사용자의 세션을 "훔칠"수로 , 사람들은 이런 방식으로 웹 사이트를 공격합니다. 따라서 사용자의 로그인 여부에 따라 게시 정보를 선택적으로 중지하려면 IsAuthenticated는를 살펴보고 로그인 한 user- 유형에 따라 선택적으로 정보를-display하려면 역할 공급자 를 사용합니다 . GET을 캐시 할 수 있기 때문에 GET 에서 작업에 대한 액세스를 선택적으로 허용 하는 유일한 방법은 AuthorizeAttribute를 사용하는 것입니다.

업데이트 편집 한 질문에 대한 응답 : 이미 질문에 TempData를 사용하는 좋은 예가 있습니다. 즉, POST 실패 후 간단한 오류 메시지를 반환합니다. 무엇을 해야하는지세션에 저장되는 경우 ( "별로"이상), 저는 세션을 사용자 별 캐시라고 생각합니다. 비 사용자 별 캐시와 마찬가지로 보안에 민감한 정보를 여기에 두지 마십시오. 그러나 찾는 데 상대적으로 비싼 물건을 붙일 수있는 좋은 장소입니다. 예를 들어, Site.Master에는 사용자의 전체 이름이 표시됩니다. 그것은 데이터베이스에 저장되며 우리가 제공하는 모든 페이지에 대해 데이터베이스 쿼리를 수행하고 싶지 않습니다. (애플리케이션 설치는 단일 회사에서 사용되므로 사용자의 전체 이름은 "보안에 민감한"것으로 간주되지 않습니다.) 따라서 Session을 사용자가 보유한 쿠키에 따라 달라지는 캐시로 생각하면 별로 틀렸어.


기본 TempData 공급자는 세션을 사용하므로 다음 요청이 끝날 때 TempData가 지워진다는 점을 제외하고는 구분이 거의 없습니다. 데이터가 두 요청 사이에서만 지속되어야하는 경우 TempData를 사용해야합니다. 두 번째 요청은 사용자의 다른 요청 (예 : AJAX)과 관련된 문제를 방지하기 위해 리디렉션이되는 것이 좋습니다. 데이터가 그보다 오래 지속되어야하는 경우 TempData를 다시 채우거나 세션을 직접 사용해야합니다.


"작동하지 않는다"는 설명이별로 없지만 몇 가지 제안을하겠습니다.

내부적으로 TempData는 세션을 사용하여 값을 저장합니다. 따라서 저장 메커니즘이나 이와 유사한 측면에서 큰 차이가 없습니다. 그러나 TempData는 다음 요청이 수신 될 때까지만 지속됩니다.

사용자가 양식 게시물 사이에 ajax 요청을하면 TempData가 사라집니다. 모든 요청은 TempData를 지 웁니다. 따라서 수동 리디렉션을 수행 할 때만 신뢰할 수 있습니다.

보기 양식의 숨겨진 필드에 회의 ID를 단순히 렌더링 할 수없는 이유는 무엇입니까? 이미 모델에 추가하고 있습니다. 또는 경로에 매개 변수로 추가하십시오.


귀하의 요구 사항에 따라 사용할 수 있습니다. 설명은 다음과 같습니다.

TempData세션

TempData

  1. TempData를 사용하면 단일 후속 요청 기간 동안 데이터를 유지할 수 있습니다.
  2. ASP.net MVC는 연속적인 요청이 결과를 반환하면 자동으로 tempdata의 값을 만료합니다 (즉, 대상 뷰가 완전히로드 될 때까지만 살아 남음을 의미합니다).
  3. 현재 및 후속 요청에만 유효합니다.
  4. TempData에는 TempData의 값을 유지하는 Keep 메서드가 있습니다.

    예:

    TempData.Keep (), TempData.Keep ( "EmpName")

  5. TempData는 내부적으로 값을 Session 변수에 저장했습니다.

  6. 유효성 검사 메시지, 오류 메시지 등과 같은 한 번만 메시지를 저장하는 데 사용됩니다.

세션:

  1. 세션은 사용자 세션이 만료되지 않을 때까지 훨씬 더 오랫동안 데이터를 저장할 수 있습니다.
  2. 세션 시간 초과가 발생하면 세션이 만료됩니다.
  3. 모든 요청에 ​​유효합니다.
  4. 해당 없음
  5. 세션 변수는 SessionStateItemCollection 개체에 저장됩니다 (페이지의 HttpContext.Session 속성을 통해 노출됨).
  6. 사용자 세션 전반에 걸쳐 필요한 사용자 ID, 역할 ID 등과 같은 장수명의 데이터를 저장하는 데 사용됩니다.

TempData 및 세션, 둘 다 데이터를 가져 오기 위해 typecasting이 필요하고 런타임 예외를 피하기 위해 null 값을 확인합니다.


나는 페이지 자체에서 그런 종류의 데이터를 유지하는 것을 선호합니다. 회의 ID를 숨겨진 입력으로 렌더링하여 컨트롤러에 다시 제출합니다. 그런 다음 게시물을 처리하는 컨트롤러는 해당 회의 ID를 렌더링 할 뷰에 다시 제공 할 수 있으므로 회의 ID가 필요한 한 기본적으로 전달됩니다.

작동 할 메서드를 호출하기 전에 전역 변수에 값을 저장하는 것과 값을 메서드에 직접 전달하는 것의 차이와 비슷합니다.


MvcContrib의 솔루션을 제안합니다 : http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

전체 MvcContrib을 원하지 않는 경우 솔루션은 MvcContrib 소스에서 쉽게 가져올 수있는 메서드 1 개 + 클래스 1 개뿐입니다.


TempData 속성 값은 세션 상태에 저장됩니다. TempData 값은 읽거나 세션 시간이 초과 될 때까지 유지됩니다. 한 컨트롤러 뷰에서 다른 컨트롤러 뷰로 데이터를 전달하려면 TempData를 사용해야합니다.

데이터가 전체 응용 프로그램에 필요한 경우 세션 사용

참고 URL : https://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc

반응형