报错‘IJsonHelper未定义Encode方法’,如何在视图中转字符串列表为JS数组?
解决‘IJsonHelper' does not contain a definition for 'Encode'’错误
嘿,这个问题我碰到过好多次了,其实根源是框架版本的差异——你用的是ASP.NET Core,而Json.Encode是旧版ASP.NET MVC(Framework)里的方法,在ASP.NET Core中,IJsonHelper已经移除了Encode方法,取而代之的是Serialize方法来处理JSON序列化。
下面给你分步解决的方案:
1. 直接替换方法名修复错误
把你原来代码里的Json.Encode改成Json.Serialize就行,还要注意Razor语法的小细节——不需要在allusers前面重复加@,因为已经在Razor代码块的上下文里了。
修正后的脚本部分代码:
<script> var sourcearray = null; $(document).ready(function () { var arr = JSON.parse('@Html.Raw(Json.Serialize(allusers))'); // 后续逻辑... }); </script>
2. 优化异步调用(避坑提醒!)
另外,我必须提醒你:在视图里直接用.Result调用异步方法GetAllUsersAsync()是非常危险的,很容易导致线程死锁。正确的做法是把异步逻辑移到控制器里处理,再把数据传递给视图:
控制器示例代码:
public async Task<IActionResult> YourViewName() { var boxManager = new DSSTools.Managers.BoxManager(); // 用await异步获取数据,避免死锁 var userList = (await boxManager.GetAllUsersAsync()).Entries.Select(u => u.Login).ToList(); // 把处理好的列表传给视图 return View(userList); }
对应的视图调整:
把视图的模型类型改成IEnumerable<string>(因为你只需要用户的Login字段),这样代码更简洁,还省掉了JSON.parse的步骤:
@model IEnumerable<string> @section Scripts { <script> $(document).ready(function () { // 直接用Json.Serialize序列化模型,Html.Raw确保不被转义 var sourcearray = @Html.Raw(Json.Serialize(Model)); console.log(sourcearray); // 这里已经是合法的JavaScript数组了 }); </script> }
3. 旧版MVC的特殊情况(如果你用的是.NET Framework)
如果你的项目是旧版ASP.NET MVC(基于.NET Framework),那可能是缺少命名空间引用,在视图顶部添加以下代码即可:
@using System.Web.Helpers
不过从你的错误提示来看,你大概率用的是ASP.NET Core,所以优先用前面的方案。
内容的提问来源于stack exchange,提问作者Bassie
相关产品推荐
相关产品推荐

