首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >.Net核心获取ApplicationUser对象

.Net核心获取ApplicationUser对象
EN

Stack Overflow用户
提问于 2017-06-29 19:14:52
回答 1查看 3.5K关注 0票数 2

我在standart项目的ApplicationUser中添加了一些特定的属性。添加的一些属性属于自定义类。由于我使用EntityFramework,它为用户创建了一个dbtable,并为每个自定义类创建了一个dbtable。我将属性添加到我的ManageController和视图中,并将这些属性添加到特定的dbtable工作中,但我无法访问它们。在dbo.AspNetUsers中添加了一个列,它在属性+ ID之后调用(在我的示例“NameID”中)。

现在,如果我在ManageController中加载用户,则加载每个普通属性,但自定义属性为null。

我的问题是,如何加载自定义对象(真正存储在另一个表中)。

ApplicationUser.cs:

代码语言:javascript
代码运行次数:0
运行
复制
namespace refProject.Models
{
    public class ApplicationUser : IdentityUser
    {
        public Name Name { get; set; }
    }
}

ManageController.cs

代码语言:javascript
代码运行次数:0
运行
复制
//other usings
using refProject.Models;
using refProject.Models.ManageViewModels;

namespace refProject.Controllers
{
    [Authorize]
    public class ManageController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;
        //other managers

        public ManageController(
          UserManager<ApplicationUser> userManager,
          //other managers
          )
        {
            _userManager = userManager;
            //other managers
        }

        //
        // GET: /Manage/Index
        [HttpGet]
        public async Task<IActionResult> Index(ManageMessageId? message = null)
        {
            ViewData["StatusMessage"] =
                message == ManageMessageId.ChangeNameSuccess ? "Your name has been changed."
                : message == ManageMessageId.SetNameSuccess ? "Your name has been set."
                : "";

            var user = await GetCurrentUserAsync();
            if (user == null)
            {
                return View("Error");
            }
            var model = new IndexViewModel
            {
                //other Properties
                //
                //
                // THIS ONE IS NULL
                //
                //        
                Name = user.Name
                //other Properties
            };
            return View(model);
        }

        // GET: /Manage/ChangeName
        [HttpGet]
        public IActionResult ChangeName()
        {
            return View();
        }

        //
        // POST: /Manage/ChangeName
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> ChangeName(ChangeNameViewModel model)
        {
            if(!ModelState.IsValid)
            {
                return View(model);
            }
            var user = await GetCurrentUserAsync();
            if(user != null)
            {
                Name NewName = new Name();
                NewName.FirstName = model.NewFirstName;
                NewName.LastName = model.NewLastName;

                user.Name = NewName;

                IdentityResult result = await _userManager.UpdateAsync(user);
                if (result.Succeeded)
                {
                    return RedirectToAction(nameof(Index), new { Message = ManageMessageId.ChangeNameSuccess });
                }
                AddErrors(result);
                return View(model);
            }
            return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
        }

        //
        // GET: /Manage/SetName
        [HttpGet]
        public IActionResult SetName()
        {
            return View();
        }

        //
        // POST: /Manage/SetName
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> SetName(SetNameViewModel model)
        {
            if(!ModelState.IsValid)
            {
                return View(model);
            }

            var user = await GetCurrentUserAsync();
            if(user != null)
            {
                Name NewName = new Name();
                NewName.FirstName = model.NewFirstName;
                NewName.LastName = model.NewLastName;

                user.Name = NewName;

                IdentityResult result = await _userManager.UpdateAsync(user);
                if(result.Succeeded)
                {
                    return RedirectToAction(nameof(Index), new { Message = ManageMessageId.SetNameSuccess });
                }
                AddErrors(result);
                return View(model);
            }
            return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
        }

        #region Helpers

        private void AddErrors(IdentityResult result)
        {
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        public enum ManageMessageId
        {
            Error,
            ChangeNameSuccess,
            SetNameSuccess,
        }

        private Task<ApplicationUser> GetCurrentUserAsync()
        {
            return _userManager.GetUserAsync(HttpContext.User);
        }

        #endregion
    }
}

Name.cs

代码语言:javascript
代码运行次数:0
运行
复制
namespace refProject.Models
{
    public class Name
    {
        public int ID { get; set; }
        public string fTitle { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string lTitle { get; set; }

        public override string ToString()
        {
            return fTitle + " " + FirstName + " " + LastName + " " + lTitle;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-29 22:25:46

这是一个众所周知的问题。它不是一个bug,而是一个设计决策。

推荐的方法是通过DbContext而不是从UserManager实现访问用户。

“添加一些更多细节:作为性能优化,ASP.NET核心标识目前只加载与用户相关的实体或满足API调用所需的角色,也就是说,它不会在像FindByName()这样的方法调用上加载相关实体(甚至内置实体),因为只有返回根才需要查找方法。 此时,针对DbContext发出查询是加载相关数据的推荐方法。如果要从应用程序代码中抽象这一点,可以扩展标识存储类和管理器类,以添加检索和返回自定义相关数据的方法。“ 评论链接

您可以按以下方式更改GetCurrentUserAsync方法:

代码语言:javascript
代码运行次数:0
运行
复制
private ApplicationUser GetCurrentUserAsync()
{
    return _userManager.Users.Include(x => x.Name).FirstOrDefault(x => x.Id == _userManager.GetUserId(User));
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44833245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档