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

.NET网站Controller ID绑定失败,考勤日志页面无法正常访问

.NET网站TimeCardLog方法考勤记录查看问题解决思路

问题根源分析

  • 路由参数不匹配:视图中链接用asp-route-id传递用户ID,但控制器方法参数是int userId,ASP.NET无法自动映射参数,导致userId取int默认值0。
  • 逻辑判断错误:未传入userId(如从个人主页进入)时,当前逻辑会错误使用默认值0作为目标ID,而非登录用户ID。
  • 需验证GetSignedInUserId()有效性:个人主页访问失败可能和该方法的实现有关,但优先解决参数与逻辑问题。

分步解决

1. 修正路由参数与控制器参数的匹配

将视图中「编辑考勤」按钮的路由参数改为与控制器参数名一致,确保ID正确传递:

<a asp-condition=@User.HasOneOfRoles("admin, manager") asp-controller="User" asp-action="TimeCardLog" asp-route-userId="@u.Id"
   class="btn"><i class="bi bi-pencil-fill"></i></a>

2. 优化控制器逻辑,处理未传参数场景

修改控制器方法,将userId设为可空类型,并调整权限与默认值逻辑:

// GET /User/TimeCardLog
public IActionResult TimeCardLog(int? userId)
{
    Console.WriteLine("Received userId: " + userId);
    // 获取登录用户ID
    var signedInUserId = User.GetSignedInUserId();

    // 确定目标用户ID
    int targetUserId;
    if (userId.HasValue && (User.IsInRole("admin") || User.IsInRole("manager")))
    {
        // 管理员/经理可查看指定用户考勤
        targetUserId = userId.Value;
    }
    else
    {
        // 普通用户或未传参数时,默认查看自己的考勤
        targetUserId = signedInUserId;
    }

    var user = _svc.GetUser(targetUserId);
    if (user is null)
    {
        Alert($"User {targetUserId} Not Found..", AlertType.warning);
        return RedirectToAction(nameof(Index));
    }

    var timeCards = _tcSvc.GetTimeCardsByUser(targetUserId);

    var model = new UserTimeCardsViewModel
    {
        User = user,
        TimeCards = timeCards,
    };

    return View(model);
}
  • 用int?(可空整数)接收参数,避免未传参时取默认值0。
  • 增加权限校验,防止普通用户越权查看他人考勤。
  • 未传参或无权限时,自动使用登录用户ID。

3. 验证GetSignedInUserId()方法有效性

如果个人主页访问仍失败,检查该扩展方法的实现是否正确:

public static class ClaimsPrincipalExtensions
{
    public static int GetSignedInUserId(this ClaimsPrincipal user)
    {
        var userIdClaim = user.FindFirst(ClaimTypes.NameIdentifier);
        if (userIdClaim == null || !int.TryParse(userIdClaim.Value, out int userId))
        {
            throw new InvalidOperationException("用户未登录或用户ID无效");
        }
        return userId;
    }
}

确保用户登录后,Claims中包含正确的NameIdentifier(用户ID)。

4. 个人主页链接修正

个人主页的考勤日志链接无需传参,直接调用方法即可:

<a asp-controller="User" asp-action="TimeCardLog" class="btn">查看我的考勤</a>

额外调试建议

  • 在控制器中输出signedInUserId的值,确认登录用户ID是否正确获取:Console.WriteLine("登录用户ID: " + signedInUserId);
  • 在_svc.GetUser方法中添加日志,验证传入的targetUserId是否正确,以及是否能找到对应用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:49:55