我需要在我的视图中访问用户的名称和ID。当我使用Page.User.Identity.Name
时,我会收到用于验证它的电子邮件。这就是我从控制器验证用户身份的方法:
if (!userService.ValidateUser(model.Email, model.Password))
FormsAuthentication.SetAuthCookie(model.Email, false);
我怎样才能做到:Page.User.Identity.UserId
或Page.User.Identity.FirstName
?
答案 0 :(得分: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 %>!
答案 1 :(得分:3)
首先,您可以创建一个动作过滤器,以便在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
集合中。
干杯。