2010-10-13 47 views
0

我需要让用户的姓名和ID在我的视图中可访问。当我使用Page.User.Identity.Name时,我收到我用来验证它的电子邮件。这是我如何去从我的控制器认证用户:asp.net中的用户标识mvc

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

我如何能够做到:Page.User.Identity.UserIdPage.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

一些更多的细节请,或示例代码。谢谢。 – 2010-10-13 19:32:21

+0

'Controller.User'与'Page.User'一样也是一样的参考。 – 2010-10-13 19:32:52

+0

如果我已经将模型传递给视图,该怎么办?我怎么能通过另一个?它也应该可以在site.master – 2010-10-13 20:30:19

3

肖恩,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)(即从DB加载用户)。例如,您可以应用一些缓存,例如将用户对象保存在HttpContext.Items集合中。

干杯。

相关问题