.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); }
再啰嗦一遍为啥原来的写法不行
执行顺序是关键:
- 服务器接收到请求,先跑所有Razor代码(包括你嵌套在JS里的
@{ ... }),这时候JS还没执行,userIdList根本不存在,服务器当然报错。 - 服务器把渲染好的HTML+JS发给浏览器。
- 浏览器加载页面,执行JS代码,这时候
GetUsers才会被调用,userIdList才有值,但服务器早就把代码跑完了,根本没法互动。
所以别想着在JS里直接嵌Razor代码调用后端方法,前后端必须通过HTTP请求来传数据才行。
内容的提问来源于stack exchange,提问作者pandakun
相关产品推荐
相关产品推荐

