【问题标题】:Displaying current username in _Layout view在 _Layout 视图中显示当前用户名
【发布时间】:2020-04-15 16:14:19
【问题描述】:

我想在 _Layout 视图的导航栏上显示当前的 ApplicationUsers Firstname+Lastname。我发现你可以像这样从当前的 RenderedBody 控制器传递你的 viewbag:

  private readonly IHttpContextAccessor _httpContext;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly ApplicationUser _user;

    public HomeController(IHttpContextAccessor httpContextAccessor, UserManager<ApplicationUser> userManager) {
       _httpContext = httpContextAccessor;
       _userManager = userManager;
        _user = _userManager.Users.Single(u => u.Id == _httpContext.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value);
    }

在控制器中:

public IActionResult Index()
    {

        ViewBag.Username = $"{_user.FirstName} {_user.Surname}";
        return View();
    }

终于在我的 _Layout 视图中:

<strong class="font-bold">@ViewBag.Username</strong>

这种方法似乎违背了常规,并且对于每个视图都将是一个巨大的痛苦。实现这一目标的标准是什么?

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    您可以将UserManagerSignInManager 注入到您的视图中。

    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    

    然后您可以测试用户是否使用SignInManager.IsSignedIn(User) 登录并使用UserManager.GetUserName(User) 显示用户名

    @if (SignInManager.IsSignedIn(User))
    {
      <form asp-area="" asp-controller="Account" asp-action="LogOff" method="post" id="logoutForm" class="navbar-right">
       <ul class="nav navbar-nav navbar-right">
        <li>
         <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
        </li>
        <li>
          <button type="submit" class="btn btn-link navbar-btn navbar-link">Log off</button>
        </li>
       </ul>
     </form>
    }
    

    PS。另外你还需要添加这两个using

    @using Microsoft.AspNetCore.Identity
    @using MyWebApp.Models
    

    【讨论】:

    • 啊,太完美了!简单高效。非常感谢,Ahmar。
    • 很高兴为您提供帮助。 :)
    • 这在我在 Visual Studio 2017 中的 Asp.net MVC 项目中不起作用。不知道@inject 是什么,不确定这是否是因为它是 EntityFrameWork 而不是核心。 .NET 4.7
    • 太棒了,我将上面的内容添加到 _Layout.cshtml 页面中并且它工作正常。我正在使用带有 .Net 6.0.3 的 Razor 页面
    【解决方案2】:

    对于 ASP.Core Razor 页面,将 UserManager 注入 _Layout.cshtml

    @using Microsoft.AspNetCore.Identity
    @using webApp.Models
    @inject UserManager<ApplicationUser> userManager
    @{
        Layout = "/Pages/Shared/_Layout.cshtml";
        var user = await userManager.GetUserAsync(User);
        var displayName = user.DisplayName;
        var imagePath = user.GravatarImageUrl;
    }
    
    <h1>Manage your account</h1>
    
    <div>
        <h4>Change your account settings</h4>
        <hr />
        <div class="row">
            <div class="col-md-3">
                <img src="@imagePath" alt="Avatar" />
                <h4>@displayName</h4>
                <partial name="_ManageNav" />
            </div>
            <div class="col-md-9">
                @RenderBody()
            </div>
        </div>
    </div>
    
    @section Scripts {
        @RenderSection("Scripts", required: false)
    }
    

    【讨论】:

      【解决方案3】:

      更新的答案, 在你的_Layout.cshtml:

      @using System.Security.Claims
      @using  Microsoft.AspNetCore.Http
      
      @inject IHttpContextAccessor httpContextAccessor
      @{
          string name = 
             httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
      }
      

      【讨论】:

        【解决方案4】:

        您可以从您的扩展用户(ApplicationUser)处获取任何信息:

        // Inject SignInManager and UserManager in your _Layout.cshtml
        @inject SignInManager<ApplicationUser> signInManager;
        @inject UserManager<ApplicationUser> userManager;
        
        
         @if (signInManager.IsSignedIn(User))
                        {
                           // Get the current logged in user
                            Task<ApplicationUser> GetCurrentUserAsync() => userManager.GetUserAsync(User);
        
                            var user = await GetCurrentUserAsync();
        
                            var firstName = user.FirstName;
                            var lastName = user.LastName;
                            var lastLogin = user.LastLogin;
                            var nationality = user.Nationality;
                            var phoneNumber = user.PhoneNumber;
        
                            <h4>@firstName @lastName</h4>                                                                     
                            <h4>@lastLogin</h4>                                                
                            <h4>@nationality</h4>                                                
                            <h4>@phoneNumber</h4>
                        }
        

        【讨论】:

          猜你喜欢
          • 2020-10-18
          • 1970-01-01
          • 2016-01-25
          • 1970-01-01
          • 2021-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-06
          相关资源
          最近更新 更多