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

.NET 5 MVC中JsonResult返回双参数无法被AJAX正常读取问题求助

问题原因与解决方案

读取差异的根本原因

两种返回方式的JSON结构完全不同:

  • 单参数返回时,后端返回的是纯字符串"Success",序列化后的JSON就是普通字符串,前端直接拿data做字符串匹配即可,不存在属性读取问题。
  • 双参数返回时,后端返回的是匿名对象,序列化后的JSON是包含两个属性的结构体,默认配置下.NET 5的JSON序列化器会把属性名转成小驼峰格式,你后台定义的Isuccess会被序列化成isuccess,MessageError会被序列化成messageError,前端用大写开头的data.Isuccess读取自然拿不到值,得到的是undefined,所以判断逻辑失效。

另外你代码里还存在两个可能导致异常的问题:

  1. 如果你的jQuery代码是写在独立的.js文件中,@Url.Content("Latihan/Delete")是Razor视图专属语法,只会在.cshtml文件中被解析,独立JS文件中不会处理,最终请求路径会变成无效字符串,触发404错误。
  2. 失败分支的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:45:07