2009-08-21 8 views
7

W przypadku moich działań, które będą współdziałać z kontem użytkownika, chciałbym utworzyć obiekt "TheUser" oprócz dodania tego obiektu do "ViewData [" TheUser "]" jak tylko zostanie wywołana jakakolwiek akcja na moim kontrolerze.Definiowanie użytkownika za pomocą User.Identity.Name w konstruktorze sterownika

Jeśli Użytkownik jest zalogowany, pobierze informacje Użytkownika z bazy danych, jeśli nie, obiekt "TheUser" będzie pusty.

Próbowałem uzyskać dostęp do "User.Identity.Name" w konstruktorze kontrolera, ale nie został on utworzony przed wywołaniem jakiejkolwiek akcji.

Szukałem niestandardowych filtrów autoryzacji, ale te nie pozwoliłyby mi utworzyć obiektu "TheUser" i przechowywać go w ViewData.

ten krótki fragment, co chciałbym osiągnąć:

[Authorize] 
public class HomeController : Controller 
{ 
    User TheUser; 

    public HomeController() 
    { 
     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
+0

ta odpowiedź pomogła mi za MVC3 http://stackoverflow.com/a/1506311/511438 –

Odpowiedz

15

Utworzono niestandardową klasę kontrolera bazowego i dodano do niej właściwość "CurrentUser".

W metodzie Initialize umieściłem logikę, aby uzyskać użytkownika, a następnie dodać go do ViewData i właściwości "CurrentUser" kontrolera.

miałem kontrolery dziedziczyć klasę zwyczaj baza Controller i udało mi się odniesienia „CurrentUser” zmiennej gdziekolwiek w kontrolerze:

public class CustomControllerClass : Controller 
{ 
    public User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string userName = requestContext.HttpContext.User.Identity.Name; 
      CurrentUser = UserRepository.GetUser(userName); 
     } 

     ViewData["CurrentUser"] = CurrentUser;     
    } 
} 
+0

Kiedy odziedziczyłem kontroler z kontrolera BaseController, wszystkie moje żądania sieciowe kończą się po wykonaniu metody Execute BaseController i nie przechodzą do metod Action. Dostaję pustą stronę w przeglądarce. Czy jest coś jeszcze, co musimy zrobić, aby to uruchomić? – teenup

+0

Puneet, proszę spojrzeć na moją edycję. Moja oryginalna odpowiedź była dla ASP.NET MVC 1. Zaktualizowałem ją, aby nadpisać metodę 'Initialize', ponieważ jest to miejsce akceptacji tego typu rzeczy w MVC 2 i 3 – Omar

+0

Dziękuję bardzo, naprawdę to doceniłem. Przez długi czas Twoja odpowiedź była miła i zwięzła. –

1

Czy Użytkownika muszą być instancja dla każdego działania kontrolera lub tylko wybrane z nich?

Jeśli utworzysz właściwość ActionFilterAttribute, masz dostęp do kontekstu kontrolera. Nie jestem pewien, czy jest to prawdą w przypadku AuthorizationFilters, ale możesz spróbować czegoś takiego:

public class MyCustomFilter: ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["TheUser"] = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 
     base.OnActionExecuting(filterContext); 
    } 
} 

Następnie załącz to do niezbędnych działań kontrolera.

+0

theuser Służy do każdego działania. Co mnie zastanawia, to że chociaż [Autoryzuję] zapewnia, że ​​użytkownik jest uwierzytelniony, nie mam dostępu do User.Identity, ale mogę uzyskać dostęp do ViewData. – Omar

4

I Ustaw.regulatora mojej bazy w podobny sposób, przy użyciu metody constuctor, i byłem w stanie przeczytać te informacje o użytkowniku w następujący mannner. Uwaga: Przechowuję tylko obiekt UserId, nie obiekt użytkownika, ale punktem mojego kodu jest pokazanie, w jaki sposób można uzyskać wymagane informacje w metodzie contriuctor.

public abstract class BaseController : Controller 
{ 
    int _UserId = 0; 

    public int UserId 
    { 
     get { return _UserId; } 
     set { _UserId = value; } 
    } 

    public BaseController() 
    { 
     var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal; 

     if (userFromAuthCookie != null && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name)) 
     { 
      busUser userBO = AceFactory.GetUser(); 
      string userNameFromAuthCookie = userFromAuthCookie.Identity.Name; 
      _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie); 
     } 
    } 
+0

Próbowałem również zwrócić użytkownika przy użyciu User.Identity - 'System.Threading.Thread.CurrentPrincipal' naprawił to dla mnie - dziękuję bardzo – wheelibin

3
public abstract class YourController : Controller 
{ 
    public YourController() 
    { 
     var user = System.Threading.Thread.CurrentPrincipal; 

     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
Powiązane problemy