在Partial View中获取当前的ApplicationUser

时间:2013-11-15 00:19:12

标签: asp.net asp.net-mvc-5 asp.net-identity

新的MVC 5项目有_LoginPartial,显示当前用户名:

@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", 
                 "Manage", 
                 "Account", 
                 routeValues: null, 
                 htmlAttributes: new { title = "Manage" })

我已将最后/名字段添加到ApplicationUser类,但无法找到显示它们的方法而不是UserName。有没有办法访问ApplicationUser对象?我尝试过简单的转换(ApplicationUser)User,但它会产生错误的强制转换异常。

2 个答案:

答案 0 :(得分:4)

  1. 在MVC5中,Controller.UserView.User,返回GenericPrincipal个实例:

    GenericPrincipal user = (GenericPrincipal) User;
    
  2. User.Identity.Name有用户名,您可以使用它来检索ApplicationUser

  3. C#具有很好的扩展方法功能。探索并用它进行实验。

  4. 以下为例,涵盖对当前问题的一些理解。

    public static class GenericPrincipalExtensions
    {
        public static ApplicationUser ApplicationUser(this IPrincipal user)
        {
            GenericPrincipal userPrincipal = (GenericPrincipal)user;
            UserManager<ApplicationUser> userManager = new UserManager<Models.ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
            if (userPrincipal.Identity.IsAuthenticated)
            {
                return userManager.FindById(userPrincipal.Identity.GetUserId());
            }
            else
            {
                return null;
            }
        }
    }
    

答案 1 :(得分:2)

我做到了!

使用此链接中的帮助:http://forums.asp.net/t/1994249.aspx?How+to+who+in+my+_LoginPartial+cshtml+all+the+rest+of+the+information+of+the+user

我这样做了:

在AcountController中,添加一个动作以获取所需的属性:

 [ChildActionOnly]
    public string GetCurrentUserName()
    {
        var user = UserManager.FindByEmail(User.Identity.GetUserName());
        if (user != null)
        {
            return user.Name;
        }
        else
        {
            return "";
        }
    }

在_LoginPartialView中,将原始行更改为:

@Html.ActionLink("Hello " + @Html.Raw(Html.Action("GetCurrentUserName", "Account")) + "!", "Index", "Manage", routeValues: new { area = "" }, htmlAttributes: new { title = "Manage" })