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

.NET Core:独立JS文件调用Razor页面C#函数遇变量识别问题

问题根源:前后端代码执行时机搞混啦

你现在踩的坑是典型的把服务器端Razor代码和客户端JS的执行顺序搞反了:

  • Razor代码块(就是@{ ... }里的C#代码)是在服务器渲染页面的时候就跑完了,这时候浏览器连页面都还没拿到呢!JS函数里的userIdList是客户端运行时才会有的变量,服务器根本看不到它,自然会报“当前上下文不存在”的错。
  • 反过来,JS是在浏览器里跑的,没法直接调用服务器端的_Manager.FindByIdAsync这种C#方法——前后端之间的通信必须通过HTTP请求来完成。
正确的解决思路:用AJAX请求后端接口

我们得把“根据用户ID列表获取用户”的逻辑放到后端控制器里,然后让JS通过异步请求去拿数据,分三步来:

第一步:在后端控制器写一个获取用户的接口

比如在你的HomeController里加这么个Action:

public async Task<IActionResult> GetUsers(string userIdList)
{
    if (string.IsNullOrWhiteSpace(userIdList))
    {
        return Json(new List<object>());
    }

    var userIds = userIdList.Split(',');
    var userList = new List<object>();

    foreach (var id in userIds)
    {
        var user = await _Manager.FindByIdAsync(id);
        if (user != null)
        {
            // 只返回你需要的字段,别把用户的敏感信息都返回了
            userList.Add(new
            {
                UserId = user.Id,
                UserName = user.UserName,
                Email = user.Email
            });
        }
    }

    return Json(userList);
}

第二步:把原来的GetUsers改成异步请求的JS函数

不管是放在Index.cshtml里还是你的独立JS文件里,改成这样:

async function GetUsers(userIdList) {
    console.log("要查询的用户ID列表:", userIdList);

    try {
        // 用fetch发请求,注意编码参数避免特殊字符问题
        const res = await fetch(`/Home/GetUsers?userIdList=${encodeURIComponent(userIdList)}`);
        const users = await res.json();
        return users;
    } catch (err) {
        console.error("加载用户数据失败:", err);
        return [];
    }
}

第三步:在循环里正确调用异步函数

因为现在GetUsers是异步函数,得用await或者.then()来处理返回结果:

// 用for...of循环保证异步顺序,forEach里用async会导致并行执行且无法等待全部完成
for (const item of DataList) {
    const users = await GetUsers(item.AssignedUsers);
    // 这里拿到users后就可以做你要的操作了,比如渲染到页面
    console.log("获取到的用户数据:", users);
}
再啰嗦一遍为啥原来的写法不行

执行顺序是关键:

  1. 服务器接收到请求,先跑所有Razor代码(包括你嵌套在JS里的@{ ... }),这时候JS还没执行,userIdList根本不存在,服务器当然报错。
  2. 服务器把渲染好的HTML+JS发给浏览器。
  3. 浏览器加载页面,执行JS代码,这时候GetUsers才会被调用,userIdList才有值,但服务器早就把代码跑完了,根本没法互动。

所以别想着在JS里直接嵌Razor代码调用后端方法,前后端必须通过HTTP请求来传数据才行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:29:20