从.net Core中的layout.cshtml访问数据库

时间:2018-09-27 11:03:16

标签: c# .net asp.net-core

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

[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核心中,我不知道如何进行或搜索什么。

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

3 个答案:

答案 0 :(得分:1)

您在这里可以做的是创建一些服务(并在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>
}

答案 1 :(得分:0)

您可以创建一个ViewBag.IsCompanyOwnerMenuVisible并为其分配逻辑:

控制器:

ViewBag.IsCompanyOwnerMenuVisible = userInfo.CompanyID.HasValue; 

然后在您的视图内:

查看:

@if(ViewBag.IsCompanyOwnerMenuVisible)
{
    //Your menu code here
}

或者您可以直接在视图中查看它:

@if(Model.CompanyID.HasValue)
{
    //Your menu code here
}

答案 2 :(得分:0)

我最终制作了一个继承自IdentityUser的ApplicationUser类。然后,我可以将IdentityUser在项目中弹出的所有位置更改为ApplicationUser。

然后在applicationUser中,我添加了我需要的属性,使用Add-migration添加了迁移,并更新了数据库。

我的ApplicationUser类如下:

<li>
   <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">
           Hello @user.Fullname
   </a>
</li>

在我的布局中,我可以使用以下命令调用属性:

{{1}}

我遵循了本教程: https://www.youtube.com/watch?v=tW5QwWPKXaY

希望这对其他人有帮助:-) 我标记了“戳”的答案,因为正是他指向声称的指针使我谷歌搜索;-)