2013-11-15 4 views
2

Нового MVC 5 Проекта имеет _LoginPartial, которые отображают текущее имя пользователя:Получить текущую ApplicationUser в PartialView

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

я добавил последнее/первое имя поля в класс ApplicationUser, но не может найти способ, чтобы отобразить их вместо имени пользователя. Есть ли способ доступа к объекту ApplicationUser? Я пробовал прямолинейное литье (ApplicationUser)User, но он генерирует исключение для произвольного литья.

ответ

4
  1. В MVC5, Controller.User и View.User, возвращения GenericPrincipal экземпляр:

    GenericPrincipal user = (GenericPrincipal) User; 
    
  2. User.Identity.Name имеет имя пользователя, вы можете использовать его, чтобы получить ApplicationUser

  3. C# имеет хорошую особенность расширения методы. Исследуйте и экспериментируйте с ним.

Использование ниже в качестве примера, которые охватывают некоторое понимание текущего вопроса.

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; 
     } 
    } 
} 
+0

Я смог использовать его с out GenericPrincipal, потому что бросок бросает плохое исключение. – Sergi0

+0

@ Sergi0 слишком плохо, что вы не разделяете свое решение. –

+0

Этот код не работает, кстати. –

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" }) 
+0

, если у вас есть функция, скажем, ChangeUserName в другом частичном виде в другом представлении, но с использованием одного и того же макета, будет ли обновление _LoginPartialView, если данные будут изменены? –

+0

Если я понимаю ваш вопрос, вам нужно будет сделать ajax для обновления представления. Мое решение требует загрузки страницы. –

+0

Это было самое чистое и понятное решение, которое я нашел. – VSB

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