You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core:按用户部门ID空值分配传真权限及导航栏控制问题

解决方案

1. 实现根据用户部门权限加载传真数据

修改OnGetAsync方法,先获取当前登录用户,再根据用户的DepartId是否为空决定加载所有传真还是仅所属部门的传真,同时修正分页逻辑(分页需作用在传真数据查询上,而非用户查询):

public ICollection<Fax> Faxes { get; set; }
public int PageSize { get; set; }
public int TotalFaxes { get; set; }
public int PageNo { get; set; }

public async Task OnGetAsync(int s = 5, int p = 1)
{
    PageSize = s;
    PageNo = p;
    
    // 获取当前登录用户
    var username = HttpContext.Session.GetString("username");
    var currentUser = await _context.Registers
        .Include(r => r.Depart)
        .SingleOrDefaultAsync(r => r.UserName == username);

    if (currentUser == null)
    {
        // 未找到用户,返回空数据
        Faxes = new List<Fax>();
        TotalFaxes = 0;
        return;
    }

    IQueryable<Fax> faxQuery = _context.Faxes;

    if (currentUser.DepartId != null)
    {
        // 用户绑定了部门,仅加载该部门的传真
        faxQuery = faxQuery.Where(f => f.DepartmentId == currentUser.DepartId);
    }
    // DepartId为空时,默认加载所有传真

    // 计算总条数
    TotalFaxes = await faxQuery.CountAsync();
    // 分页获取数据
    Faxes = await faxQuery
        .Skip((p - 1) * s)
        .Take(s)
        .ToListAsync();
}

代码说明

  • 单独查询当前登录用户,避免嵌套查询导致的分页逻辑错误
  • 根据currentUser.DepartId动态构建查询条件,实现权限控制
  • 分页逻辑直接作用在传真数据集上,保证分页结果准确
  • 增加用户不存在的边界处理,避免空引用异常

2. 布局页实现登录前隐藏导航栏

在布局页(如_Layout.cshtml)中,通过判断Session中是否存在username来控制导航栏的显示:

@if (HttpContext.Session.GetString("username") != null)
{
    <!-- 登录后显示的导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <a class="navbar-brand" asp-page="/Index">传真管理系统</a>
        <div class="collapse navbar-collapse">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item">
                    <a class="nav-link" asp-page="/Fax/Index">传真列表</a>
                </li>
                <!-- 其他导航项 -->
            </ul>
            <span class="navbar-text">
                当前用户: @HttpContext.Session.GetString("username")
                <a asp-page="/Account/Logout" class="btn btn-sm btn-outline-light">退出</a>
            </span>
        </div>
    </nav>
}

<div class="container mt-4">
    @RenderBody()
</div>

前置配置

确保已在项目中启用Session(.NET 6+ 配置在Program.cs):

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 在app.UseRouting()之后添加
app.UseSession();

内容的提问来源于stack exchange,提问作者hossam reda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:17:52