gpt4 book ai didi

c# - 我应该如何从 ASP.NET Core View 访问我的 ApplicationUser 属性?

转载 作者:IT王子 更新时间:2023-10-29 04:42:31 25 4
gpt4 key购买 nike

我正在从事 ASP.Net vNext/MVC6 项目。我正在掌握 ASP.Net Identity。

ApplicationUser 类显然是我应该添加任何其他用户属性的地方,这适用于 Entity Framework,并且我的其他属性按预期存储在数据库中。

但是,当我想从我的 View 中访问当前登录用户的详细信息时,问题就来了。具体来说,我有一个 _loginPartial.cshtml,我想在其中检索和显示用户的 Gravatar 图标,为此我需要电子邮件地址。

Razor View 基类有一个 User 属性,它是一个 ClaimsPrincipal。我如何从这个 User 属性返回到我的 ApplicationUser,以检索我的自定义属性?

请注意,我不是在问如何查找信息;而是在询问如何查找信息。我知道如何从 User.GetUserId() 值中查找 ApplicationUser。这更多的是关于如何明智地处理这个问题的问题。具体来说,我不想:

  • 在我的 View 中执行任何类型的数据库查找(关注点分离)
  • 必须向每个 Controller 添加逻辑以检索当前用户的详细信息(DRY 原则)
  • 必须为每个 ViewModel 添加一个 User 属性。

这似乎是一个“横切关注点”,应该有一个集中的标准解决方案,但我觉得我错过了一 block 拼图。从 View 中获取这些自定义用户属性的最佳方式是什么?

注意:似乎 MVC 团队通过确保始终将 UserName 属性设置为用户的电子邮件地址,在项目模板中回避了这个问题,巧妙地避免了他们执行此查找以获取用户的需要电子邮件地址!这对我来说似乎有点欺骗,在我的解决方案中,用户的登录名可能是也可能不是他们的电子邮件地址,所以我不能依赖这个技巧(而且我怀疑我以后需要访问其他属性).

最佳答案

原始答案更新:(这违反了操作的第一个要求,如果您有相同的要求,请参阅我的原始答案)您可以在不修改声明和添加扩展文件(在我的原始解决方案)通过在 Razor View 中引用 FullName 作为:

@UserManager.GetUserAsync(User).Result.FullName

原答案:

这几乎只是 this stackoverflow question 的一个较短示例并关注此 tutorial .

假设您已经在“ApplicationUser.cs”中设置了属性以及适用的 ViewModels 和 Views 以进行注册。

使用“FullName”作为额外属性的示例:

修改“AccountController.cs”注册方法为:

    public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var user = new ApplicationUser {
UserName = model.Email,
Email = model.Email,
FullName = model.FullName //<-ADDED PROPERTY HERE!!!
};
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
//ADD CLAIM HERE!!!!
await _userManager.AddClaimAsync(user, new Claim("FullName", user.FullName));

await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation(3, "User created a new account with password.");
return RedirectToLocal(returnUrl);
}
AddErrors(result);
}

return View(model);
}

然后我添加了一个新文件“Extensions/ClaimsPrincipalExtension.cs”

using System.Linq;
using System.Security.Claims;
namespace MyProject.Extensions
{
public static class ClaimsPrincipalExtension
{
public static string GetFullName(this ClaimsPrincipal principal)
{
var fullName = principal.Claims.FirstOrDefault(c => c.Type == "FullName");
return fullName?.Value;
}
}
}

然后在您需要访问该属性的 View 中添加:

@using MyProject.Extensions

并在需要时调用它:

@User.GetFullName()

这样做的一个问题是我必须删除我当前的测试用户,然后重新注册才能看到“FullName”,即使数据库中有 FullName 属性。

关于c# - 我应该如何从 ASP.NET Core View 访问我的 ApplicationUser 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35781423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com