2009-03-12 1 views
1

내 MVC 응용 프로그램의 모든보기에 대해 로깅 된 사용자 (또는 아무도 아직 로그되지 않은 경우 null)의 인스턴스를 제공하고 싶습니다. 이미 InvokeAction을 재정의하고 ViewData (controllerContext.Controller.ViewData [ "LoggedUser"] = xxx)에 기록 된 사용자 인스턴스를 제공하는 자체 ControllerActionInvoker 클래스를 성공적으로 구현했습니다. 문제는 전체 응용 프로그램에서 기록 된 사용자 인스턴스를 전달하기 위해 강력하게 형식화 된 모델을 사용하고 싶습니다. 모든 강력한 형식의 ViewData 클래스에 대한 기본 클래스가 될 수있는 ApplicationViewDataBase 클래스와 로깅 된 사용자 인스턴스도 제공 할 생각이었습니다. 내 모든보기에서 기록 된 사용자 인스턴스에 쉽게 액세스 할 수 있습니다.MVC - 모든 뷰에 대해 강력한 형식의 ViewData/Model을 어떻게 든 전역 적으로 채울 수 있습니까?

ControllerActionInvoker.InvokeAction 오버라이드를 달성 한 것처럼 강력하게 형식화 할 수 있습니까? 아니면 Page.User에 내 User 인스턴스를 제공하는 것이 더 낫습니까? Page.User를 사용하는 것이 더 매끈 할 것 같지만 내 사용자 인스턴스를 삽입하는 방법을 찾지 못했습니다 ...

답변

1

아마도 User를 HttpContext에 넣는 더 좋은 방법일까요? Global.asax에에서

보호 무효를 Application_AuthenticateRequest (개체 보낸 사람, EventArgs입니다 전자) 당신은이를 추가 할 필요가 없습니다

0

; 이미 ASP.NET MVC에서 사용할 수 있습니다. ViewContext.HttpContext.User.Identity.Name을보십시오

+0

나는 그 요점을 놓치고 있다고 생각합니다. 응용 프로그램에는 로그인 한 사용자의 응용 프로그램 별 세부 정보를 저장하는 사용자 정의 사용자 클래스가있는 것이 일반적입니다. 문제는 로그인 한 사람을 찾는 것이 아니라 모든 관련 코드가 액세스 할 수 있도록 응답 처리시 데이터베이스에서 해당 사용자 개체를 일찍로드하는 것입니다. – christutty

1

이것은 미래의 방문자를 위해 오래된 질문이므로 컨트롤러에서 상속받은 basecontroller를 생성하고 OnActionExecuted()를 처리하여 사용자 정의 사용자를 추가하여 수행 할 수 있습니다 인스턴스를 컨트롤러 조치와 뷰 사이의 뷰에 추가하십시오. 여기에 대한 포괄적 인 구현이 있습니다 : http://blog.bitdiff.com/2012/05/sharing-common-view-model-data-in.html

조치 방법에 해당 데이터를 사용하려면보기가 아직 존재하지 않으므로 좀 더 복잡해집니다.

"baseView = filterContext.Controller.ViewData.Model as BaseView"를 사용하면 뷰에 액세스 할 수 있지만 ViewData.Model (https://stackoverflow.com/a/25250058/2381157 참조)을 설정하려면 사용자 정의 모델 바인더가 필요합니다. 유감스럽게도 이것은 모델 바인더가 바인딩되지 않으면 호출되지 않기 때문에 글로벌 솔루션은 아닙니다.

RouteData 또는 ActionParameters에 값을 주입하는 ActionFilter 또는 AttributeFilter가 있지만이 액션을 수행하면이 값을보기로 전송해야합니다.

이 데이터를 뷰에 삽입 할 때 깨끗하고 간단한 방법을 찾을 수 없으며 필요할 때마다 사용자 인스턴스를 검색 할 수 있도록 사용자 인스턴스의 스레드 안전 캐시 구현으로 넘어졌습니다. 데이터베이스 쿼리 오버 헤드없이. 그렇게 쉬운 일은 아니지만 교차 요청 사용자 상태를 유지하는 데있어 다른 이점이있었습니다 (일반적으로 사용자 정의 사용자 데이터를 컨트롤러 논리에 사용할 수있게하려는 이유).

관련 문제