2010-10-13 4 views
0

Мне нужно, чтобы имя пользователя и идентификатор были доступны в моем представлении. Когда я использую Page.User.Identity.Name, я получаю письмо, которое я использую для его аутентификации. Это, как я идти о проверке подлинности пользователя от моего контроллера:Идентификатор пользователя в asp.net mvc

if (!userService.ValidateUser(model.Email, model.Password)) 
     FormsAuthentication.SetAuthCookie(model.Email, false); 

Как я могу быть в состоянии сделать: Page.User.Identity.UserId или Page.User.Identity.FirstName?

ответ

3

Базовый контроллер MVC имеет свойство User, доступ к которому вы можете получить в своих действиях. Просто прикрепите свойства, необходимые для вашей модели просмотра.

public ActionResult Index() 
{ 
    var user = new UserViewModel(); 
    user.FirstName = this.User.Identity.FirstName; 
    ViewData["UserDetails"] = user; 
    // ... 
    return View(theOtherModel); 
} 

В Site.Master:

<% var userModel = ViewData["UserDetails"] as UserViewModel; %> 
Hello <%: userModel.FirstName %>! 
+0

некоторые подробности пожалуйста, или пример код. Благодарю. –

+0

'Controller.User' будет той же ссылкой, что и' Page.User'. –

+0

Что делать, если я уже передал модель в представление? Как я могу передать другую? Он также должен быть доступен на сайте.master –

3

Shaun, here's идея:

Во-первых, вы можете создать действие фильтра, так что вы впрыскивать объект, представляющий своего пользователя в коллекции ViewData. Вы можете применить этот атрибут к своему контроллеру или к действиям.

public class AddUserToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var email = filterContext.HttpContext.User.Identity.Name; 

     var user = _userService.GetUser(email); 

     filterContext.Controller.ViewData["CurrentUser"] = user; 
    } 
} 

Некоторые улучшения должны быть сделаны, конечно, это всего лишь идея.

Еще одна идея - создать базовый класс контроллера (чтобы его контроллеры расширили его), и в этом контроллере вы можете иметь метод (например, GetCurrentUser), который делает то же самое, что и в этом фильтре (т.е. загружает пользователя из базы данных). Вы можете применить некоторое кэширование, например, сохранить объект пользователя в коллекции HttpContext.Items.

Cheers.

Смежные вопросы