首页 > 解决方案 > 如何在 .NET Core 中检索当前登录用户的电子邮件?

问题描述

我已经经历了许多关于此的 SO 线程,并且我找到了一种可行的方法,(@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email)但是,我需要将电子邮件分配给页面代码中的一个变量,以便我可以将它用于其他内容和类这不是控制器类,所以我希望在控制器之外执行此操作。

我在运行视图时遇到错误,Object reference not set to an instance of an object.Email address: @user.Email我将 HomeController 中的 Index() 函数的返回类型更改为 PrescriptionModel 时,我收到错误There is no argument given that corresponds to the required formal parameter 'logger' of PrescriptionModel.PrescriptionModel(ILogger<PrescriptionModel>

标签: c#asp.net-corerazor

解决方案


在 MVC 模式的情况下,使用模型检索任何看起来非常糟糕的数据。如果您不想触摸控制器,更好的方法是在您的视图中使用代码块。例如 :

@using Microsoft.AspNetCore.Identity

@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@{
    var usr = await UserManager.GetUserAsync(User);
    var email = usr?.Email;
}

在您可以在视图中呈现变量之后

<li class="email">
                <label asp-for="userEmail">@email</label>
                <input asp-for="userEmail" class="form-control" disabled />
</li>

获取数据以查看的最佳方法是在控制器中分配它并传递给模型中的视图。

如果这种方式不适合您 - 请解释一下,我们可以找到正确的解决方案。

最好的方法,以及 MVC 实现必须如何工作:所有数据都来自使用强类型视图的控制器:

 public class HomeController : Controller
    {
        private readonly UserManager<IdentityUser> _userManager;
        public HomeController (UserManager<IdentityUser> manager)
        {
            _userManager = manager;
        }
        public async Task<IActionResult> Index()
        {
            var usr =  await _userManager.GetUserAsync(HttpContext.User);
            return View(new UserModel { Email = usr?.Email });
        }

模型在哪里:

public class UserModel
    {
        public string Email { get; set; }
    }

因此,您只需在控制器操作/索引中查询您需要的所有信息,并将其传递给您的模型查看。这允许您拥有不同用途的文件。数据操作/业务逻辑的控制器模型只是 DTO 来传递值。查看以呈现它。检查此以获得更多详细信息: https ://docs.microsoft.com/en-us/aspnet/core/mvc/overview?view=aspnetcore-3.1


推荐阅读