2012-04-10 3 views
6

내 MVC 응용 프로그램에 설정된 세션 변수가 있습니다. 세션이 만료되고 사용자가 현재 페이지를 새로 고치려고하면 세션이 더 이상 설정되지 않아 페이지가 오류를 발생시킵니다.Page_Load에 해당하는 MVC

보기를로드하기 전에 세션이 설정되어 있는지 확인할 수있는 곳이 있습니까? 아마도 Global.asax 파일에 뭔가를 넣는 것일까 요?

모든 ActionResult의 시작 부분에서 이와 같이 할 수 있습니다.

public ActionResult ViewRecord() 
{ 
    if (MyClass.SessionName == null) 
    { 
     return View("Home"); 
    } 
    else 
    { 
     //do something with the session variable 
    } 
} 

이 작업을 수행 할 수있는 다른 방법이 있습니까? 이 경우 가장 좋은 방법은 무엇입니까? 그것은 하나의 컨트롤러에 있다면

+1

, 좀 더 정보에 http : // MSDN Microsoft.com/ko-kr/gg618482 –

+0

비슷한 토론 : http://forums.asp.net/t/1287687.aspx –

+0

@ ChrisDiver의 의견 외에도 모든 컨트롤러/작업에 적용해야하는 경우 모든 다른 컨트롤러가 상속하는 기본 컨트롤러를 꾸밀 수 있습니다. – Chris

답변

0

먼저 홈으로 리디렉션하고 홈보기로 돌아 가지 않아야합니다. 그렇지 않으면 URL이 다른 위치에도 불구하고 홈 페이지가 이상하게 표시됩니다.

두 번째 세션은 이전 세션이 만료되거나 재설정 될 때 새 세션이 만들어지기 때문에 세션이 널이 될 수 없습니다. 대신 변수를 확인하고 그 변수가 null이면 세션이 새로운 것임을 알 수 있습니다.

셋째, 앱이이 세션 데이터에 의존하는 경우 세션을 전혀 사용하지 않습니다. 이 데이터를 캐시하는 데 사용하고 있습니까? 그렇다면 캐시를 사용하는 것이 더 나을 수 있습니다 (캐시 항목이 만료되면 앱에 알림이 전송됩니다).

불행히도 이것은 아마도 The XY Problem입니다. 문제가 있으며 세션이 문제를 해결한다고 생각하지만 세션과는 다른 문제가 발생하므로 세션이 해결하려고하는 문제를 해결하는 방법보다는 세션 문제를 해결하는 방법을 묻습니다.

이 문제로 해결하고자하는 실제 문제는 무엇입니까?

편집 :

아래에 의견을 바탕으로

, 당신은 URL에있는 고객 번호를 통과하지 않는 이유 : 당신은 사용자 지정 작업 필터를 필요

http://website/Controller/ViewRecord/3 

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID 
} 
+0

웹 응용 프로그램을 사용하여 고객을 검색 할 수 있습니다. 우리는 ID 번호에 따라 고객을 선택합니다. ID 번호에 세션이 설정되었습니다.나는 여기에서 그렇게되는 경우 :' \t \t { \t \t \t \t \t 공공 정적 문자열 CIF \t \t \t { \t \t \t \t을받을 경우 (HttpContext.Current.Session [ "CIF"] == NULL) \t \t \t \t \t return ""; . 다른 \t \t \t \t \t 창 HttpContext.Current.Session \t \t \t \t [ "CIF"]를 ToString(); \t \t \t} \t \t \t {HttpContext.Current.Session [ "CIF"] = value; } \t \t}'뷰에서 Session의 값을 얻기 위해 MyClass.CIF를 호출합니다. – Turp

+0

@Turp - 왜 고객을 세션에 추가해야합니까? URL에 고객 번호를 전달하는 것이 가장 좋은 이유는 무엇입니까? 그 값은 세션에 저장되지 않으며 더 이상 필요하지 않을 때 사라집니다. –

+0

웹 앱의 원래 버전에서 나보다 먼저 수행 된 방식을 제외하고는 실제 이유가 없습니다. '/ Customer/Edit/1234' 라인을 따라 무엇인가를 의미합니까? 우리는'/ CustomerProfile/Edit'처럼 * 좋은 것은 아니지만, 사용자가 현재 숫자를 임의의 숫자로 대체하여 다른 사용자를 끌어 오지 못하도록하고 있다는 점을 논의했습니다 고객의 BTY, 이것은 내부 웹 응용 프로그램입니다. 이거 어디서서야 하죠? – Turp

3

, 당신은이 작업을 수행 할 수 있습니다 : 그것은 조치 실행에 전에 실행됩니다

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    ... // do your magic 
} 

. 그 영향을받지 않는 것 컨트롤러의 조치로 리디렉션한다, 분명히

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } }); 

그러나 : 당신은 당신이 행동의 결과를 반환 아무것도, 예를 들어, 리디렉션해야합니다,하지만 거기에서보기를 반환 할 수 없습니다 재정의하십시오. 그렇지 않으면 순환 리디렉션이 발생합니다. :)

관련 문제