Razor Pages项目中无法访问Json Helper类的技术求助
你遇到的这个情况完全是ASP.NET Core和传统ASP.NET(Framework)的API差异导致的——Json和JsonRequestBehavior都是旧System.Web.Helpers包中的内容,而ASP.NET Core彻底重构了底层框架,不再兼容这个老包,所以你没法在Core项目里添加它。下面是针对不同场景的具体替代方案:
场景1:在PageModel中返回JSON结果
如果是在PageModel的handler方法里想返回JSON(比如给Telerik下拉列表提供数据源),别再用老的Json()方法了,改用ASP.NET Core内置的JsonResult:
public IActionResult OnGetGetDropdownData() { var dropdownItems = new List<SelectListItem> { new SelectListItem { Text = "选项1", Value = "1" }, new SelectListItem { Text = "选项2", Value = "2" } }; // Core里无需JsonRequestBehavior,默认允许GET请求返回JSON return new JsonResult(dropdownItems); }
注:JsonRequestBehavior在ASP.NET Core中已经被移除了,因为框架默认就允许通过GET请求返回JSON,不用像老框架那样显式设置AllowGet。
场景2:在Razor视图(.cshtml)中序列化对象为JSON
如果是在页面里需要把对象转成JSON字符串(比如给前端JS提供数据),老的@Json.Encode()已经失效,你有两个靠谱的选择:
选项A:用ASP.NET Core内置的Json序列化
ASP.NET Core 2.0支持直接用@Json.Serialize(),但要先在_ViewImports.cshtml里引入命名空间:
@using System.Text.Json
然后在页面里这样用:
<script> var dropdownData = @Json.Serialize(Model.DropdownItems); </script>
选项B:用Newtonsoft.Json(更推荐,Core 2.0默认依赖它)
ASP.NET Core 2.0默认用Newtonsoft.Json做序列化,你可以直接调用它的静态方法。先在_ViewImports.cshtml加命名空间:
@using Newtonsoft.Json
然后在页面里使用:
<script> var dropdownData = @Html.Raw(JsonConvert.SerializeObject(Model.DropdownItems)); </script>
这里用@Html.Raw()是为了避免JSON被HTML转义,保证前端能正确解析。
额外提醒
如果你在用Telerik的ASP.NET Core版本控件,建议直接看官方针对Core的示例代码,别混用Framework版本的——两者API差异不小,照搬老代码很容易踩坑。
内容的提问来源于stack exchange,提问作者Michael

