.NET 5 MVC中JsonResult返回双参数无法被AJAX正常读取问题求助
问题原因与解决方案
读取差异的根本原因
两种返回方式的JSON结构完全不同:
- 单参数返回时,后端返回的是纯字符串
"Success",序列化后的JSON就是普通字符串,前端直接拿data做字符串匹配即可,不存在属性读取问题。 - 双参数返回时,后端返回的是匿名对象,序列化后的JSON是包含两个属性的结构体,默认配置下.NET 5的JSON序列化器会把属性名转成小驼峰格式,你后台定义的
Isuccess会被序列化成isuccess,MessageError会被序列化成messageError,前端用大写开头的data.Isuccess读取自然拿不到值,得到的是undefined,所以判断逻辑失效。
另外你代码里还存在两个可能导致异常的问题:
- 如果你的jQuery代码是写在独立的
.js文件中,@Url.Content("Latihan/Delete")是Razor视图专属语法,只会在.cshtml文件中被解析,独立JS文件中不会处理,最终请求路径会变成无效字符串,触发404错误。 - 失败分支的SweetAlert提示直接把
data对象传给text参数,会显示成[object Object],无法正常展示错误信息。
修复步骤
你可以任选下面两种方案之一解决属性名匹配问题,再处理剩下的两个小问题即可:
- 方案1:调整前端属性名(更简单,推荐),直接把前端读取属性的地方改成和序列化后的小驼峰命名一致,同时调整错误提示的文本拼接逻辑,修改AJAX请求的URL。
- 方案2:修改后端序列化规则(保持属性名大小写一致),如果不想改前端代码,可以全局配置JSON序列化规则,关闭驼峰命名转换,保持属性名和后端定义一致。
代码修改示例
前端代码修改
function ConfirmDelete(id) { Swal.fire({ icon:'question', title: '确认要删除吗?', showCancelButton: true, confirmButtonText: '是', confirmButtonColor: '#d33', cancelButtonText: '否' }).then((result) => { if (result.isConfirmed) { $.ajax({ type: 'POST', // 写在cshtml里可以保留原来的@Url.Content,单独js就写相对路径即可 url: '/Latihan/Delete', data: { Id: id }, dataType: "json", success: function (data) { // 属性名改成小驼峰和序列化结果匹配 if (data.isuccess == true) { Swal.fire({ icon: 'success', title: '删除成功', text: '', confirmButtonText: '好的' }).then((result) => { if (result.isConfirmed) { location.reload(); } }); } else { Swal.fire({ icon: 'error', title: '出现错误', // 把错误列表拼接成字符串显示 text: data.messageError.join('、'), confirmButtonText: '好的' }).then((result) => { if (result.isConfirmed) { location.reload(); } }); } }, error: function (data) { Swal.fire({ icon: 'error', title: '未知错误', text: '删除失败', confirmButtonText: '好的' }).then((result) => { if (result.isConfirmed) { location.reload(); } }); } }); } }) };
后端序列化规则修改(选方案2才需要调整)
如果是Startup.cs,在ConfigureServices方法中添加配置:
services.AddControllersWithViews() .AddJsonOptions(options => { // 关闭驼峰命名转换,保持属性名和定义一致 options.JsonSerializerOptions.PropertyNamingPolicy = null; });
如果是用顶级语句的Program.cs,修改如下:
var builder = WebApplication.CreateBuilder(args); // 添加控制器与视图服务时注入JSON配置 builder.Services.AddControllersWithViews() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; }); // 后续其他配置保持不变
修改完成后可以打开浏览器F12调试工具,在Network面板查看Delete请求的响应内容,确认JSON结构和属性名符合预期即可。
内容的提问来源于stack exchange,提问作者ardiansah
相关产品推荐
相关产品推荐

