Asp .Net Core 在数据库检查布局时隐藏菜单

Asp .Net Core hide menu on layout on database check

根据数据库检查,我需要在侧边栏菜单中隐藏和显示一些链接,但由于布局没有页面模型,我该如何实现?如果完成索赔很容易,但我需要访问数据库

@if (User.Identity.IsAuthenticated)
{
    <li class="nav-item has-treeview">

        <a asp-page="/Account/Documentos/Index" class="nav-link custom-sidebar-link">
            <i class="nav-icon fas fa-file-alt"></i>
            <p class="text-white">
                Documentos
            </p>
        </a>

    </li>
    // need to hide this on database check
    <li class="nav-item has-treeview">

        <a asp-page="/Account/Consumos/Index" class="nav-link custom-sidebar-link">
            <i class="nav-icon fas fa-cogs"></i>
            <p class="text-white">
                Arranque Produção
            </p>
        </a>

    </li>
}  

您可以使用 viewmodel 或 HttpContext

由于您尝试在布局(不包含模型)中执行数据库操作,Dependency Injection 可以帮助您。

您可以定义具有数据库访问方法的 class,将其注册到您的服务,并从任何 View/Controller/pageModel

轻松使用它的方法

我用代码解释一下:

这是我们的依赖项:

public class MyDependency 
{
    // You can use dependency injection in a chained fashion, 
    // DBContext is injected in our dependency
    private readonly DBContext _dbContext;

    public MyDependency(DBContext dbContext)
    {
        _dbContext = dbContext;
    }

    // Define a method that access DB using dbContext
    public bool CheckInDb()
    {
        return dbContext.SomeCheck();
    }
}

在您的 Startup 中将其注册到您的服务(您的依赖项应在注册 DBContext 后注册)

public void ConfigureServices(IServiceCollection services)
{
    // Some code here

    services.AddDbContext<DBContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddScoped<MyDependency>();
}

然后在你的布局中:

@inject MyDependency MyDependency

@if(MyDependency.CheckInDb())
{
    // Do something
} 
else
{
    // Do something else
}