首页 > 解决方案 > 从 .net core 中的 layout.cshtml 访问数据库

问题描述

我在这样的模型中有一组用户:

[Key]
        [Required]
        public int ID { get; set; }

        [ForeignKey("Employee")]
        public int? EmployeeID  { get; set; }

        public int? CompanyID { get; set; }

        public string UserID { get; set; }

        [DataType(DataType.Text)]
        public string Firstname { get; set; }

        [DataType(DataType.Text)]
        public string Middlenames { get; set; }

        [DataType(DataType.Text)]
        public string Lastname { get; set; }

        [DataType(DataType.Text)]
        public string Address { get; set; }

        [DataType(DataType.Text)]
        public string Postnumber { get; set; }

        [DataType(DataType.Text)]
        public string City { get; set; }

        [DataType(DataType.Text)]
        public string Phone { get; set; }

        [DataType(DataType.EmailAddress)]
        [Required]
        public string Email { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime CreatedDate { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime EditedDate { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime CurrentLoginTime { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime LastLoginTime { get; set; }

        public virtual Employee Employee { get; set; }

        public virtual Company Company { get; set; }

我想要做的是根据 companyID 是否有值在我的布局文件中显示一个菜单项。

在 MVC5 中,我可以立即做到这一点,但在 .net 核心中,我不知道如何继续或搜索什么。

我希望这里的人可以告诉我,这是如何工作的以及我应该怎么做:-)

标签: c#.netasp.net-core

解决方案


您可以在这里做的是创建一些服务(并将其注册到 DI 容器),它可以确定您的状况。然后,您可以将该服务注入您的视图并在其上调用一个方法来检查该值:

@inject MyUserService myUserService
@if (await myUserService.GetIsCompanyOwnerAsync(User))
{
    <div>Item for company owner</div>
}

然后,在您的服务中,您可以注入您的数据库上下文并根据当前用户查询用户:

public class MyUserService
{
    private readonly UserManager<User> _userManager;
    public MyUserService(UserManager<User> userManager)
    {
        _userManager = userManager;
    }

    public async Task<bool> GetIsCompanyOwnerAsync(ClaimsPrincipal user)
    {
        var user = await _userManager.GetUserAsync(user);
        return user.CompanyID.HasValue;
    }
}

请注意,这将导致对每个请求进行数据库查询,以便在布局中呈现该请求。从长远来看,最好将此属性直接公开为对声明主体的声明,例如OwnsCompany声明。这样,您可以直接在视图中检查声明:

@if (await User.FindFirst("OwnsCompany") != null)
{
    <div>Item for company owner</div>
}

推荐阅读