Доступ к базе данных из layout.cshtml в ядре .net - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть набор пользователей в модели, подобной этой:

[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 голосов
/ 27 сентября 2018

Что вы можете сделать здесь - создать службу (и зарегистрировать ее в контейнере 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>
}
0 голосов
/ 28 сентября 2018

В итоге я создал класс ApplicationUser, который наследуется от IdentityUser.Затем я могу изменить все места, которые IdentityUser выскакивает в моем проекте, на ApplicationUser.

В applicationUser я затем добавил нужные мне свойства, добавил миграцию с помощью Add -igration и обновил базу данных.

Мой класс ApplicationUser выглядит следующим образом:

using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TimePlus.Data
{
    public class ApplicationUser : IdentityUser
    {
        public string Fullname { get; set; }
        public int? CompanyID { get; set; }
        public int? EmployeeID { get; set; }
    }
}

В моем макете я мог бы затем вызвать свойства с помощью:

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

Я следовал этому уроку: https://www.youtube.com/watch?v=tW5QwWPKXaY

Надеюсь, что это поможет другим людям :-) Я пометил ответ "poke", так как именно его указатель на утверждения заставил меня погуглить; -)

0 голосов
/ 27 сентября 2018

Вы можете создать ViewBag.IsCompanyOwnerMenuVisible и назначить ему свою логику:

Контроллер:

ViewBag.IsCompanyOwnerMenuVisible = userInfo.CompanyID.HasValue; 

, затем внутри вашего представления:

Представление:

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

или вы можете проверить это прямо из вида:

@if(Model.CompanyID.HasValue)
{
    //Your menu code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...