首页 > 解决方案 > Asp .Net Core 在数据库检查布局上隐藏菜单

问题描述

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

@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>
}  

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

解决方案


由于您尝试在布局(不包含模型)中执行数据库操作,因此依赖注入可以帮助您。

您可以定义一个具有 DB 访问权限的方法的类,将其注册到您的服务,并从任何 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
}

推荐阅读