为啥 jQuery AJAX Post Content-Type=application/json 到 MVC 控制器操作方法导致空参数

Posted

技术标签:

【中文标题】为啥 jQuery AJAX Post Content-Type=application/json 到 MVC 控制器操作方法导致空参数【英文标题】:Why does jQuery AJAX Post Content-Type=application/json to MVC Controller Action method result in null parameter为什么 jQuery AJAX Post Content-Type=application/json 到 MVC 控制器操作方法导致空参数 【发布时间】:2021-02-16 14:00:14 【问题描述】:

我已经多次看到这个问题被问和回答,所以我很抱歉再次重复它。但是,所有这些问题都是很久以前提出的并得到了回答,所以我不确定这些答案是否与今天的 ASP.NET Core MVC 和 jQuery 的较新版本相关。

我有一个 MVC 控制器方法,它可以像这样接受类对象参数...public async Task<IActionResult> AffiliatedUsers(UserFacilityAccessDTO userAccessInfo)

为了响应用户操作,我想从 javascript 函数调用此方法。

$.ajax(
        url: location.origin + "/facility/affiliatedusers",
        method: "POST",

我要 POST 的数据是一个格式良好的 JSON 对象,位于名为 payload 的变量中。

以下是contentTypedata 值的组合,它们有效和无效。我希望有人可以帮助我了解它不起作用的情况。

这在contentType 未指定时有效

$.ajax(
        url: location.origin + "/facility/affiliatedusers",
        method: "POST",
        data: payload

在我的操作方法中,我发现 contentType (Request.ContentType) 设置为 application/x-www-form-urlencoded

但是当我按如下方式传递数据时...

        contentType: "application/json; charset=utf-8;",
        data: JSON.stringify(payload),  // MUST stringify to show up as JSON in body

我看到操作方法的参数已实例化,但没有传递任何值。即模型绑定似乎没有发生。我在某处读到 ASP.NET Core 3.1 要求您在传递 JSON 有效负载时使用 [FromBody] 装饰操作方法参数。当我这样做时,即使参数没有实例化,我也会将输入参数设置为 NULL。

我知道我有一个可行的解决方案,但我真的很好奇为什么 application/json 有效负载无法正常工作,而到目前为止我所阅读的所有内容似乎都表明这是在公园散步。我是否缺少一些简单但至关重要的设置。任何帮助将不胜感激。提前谢谢!

亲切的问候...

【问题讨论】:

你能分享你的payload吗?因为我可以成功绑定,所以问题可能是你的类型不匹配造成的。 【参考方案1】:

经过一些研究和测试,我找到了根本原因,并希望分享这些信息,以特别帮助像我这样的新人。

首先,我的有效载荷有一个 Enum 字段。所以字符串到枚举值的转换出了问题。这可以通过添加来解决

.AddJsonOptions(config =>
                    
                        // For jQuery ajax post with string values for enum this helps with conversion.
                        config.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
                    );

下一个也是更重要的问题是因为我的应用程序是一个带有视图的 MVC Web 应用程序,我的所有控制器都没有使用[ApiController] 属性进行装饰。在我看来(我不像这个社区中的许多其他人那样真正研究 github 上的 Asp.Net Core 框架代码)没有这种装饰,控制器只能处理 application\x-www-form-urlencoded 有效负载。

感谢@Yinqui 要求查看有效负载以帮助我。我希望至少有 1 位其他开发者能从我的发现中受益。

问候...

【讨论】:

以上是关于为啥 jQuery AJAX Post Content-Type=application/json 到 MVC 控制器操作方法导致空参数的主要内容,如果未能解决你的问题,请参考以下文章

jQuery ajax post提交本页面处理,为啥提交后URL还携带参数

Angular 的 $http.post 不起作用,它的 $http... 也不起作用,但 jQuerys ajax 起作用。为啥?

为啥 jQuery AJAX Post Content-Type=application/json 到 MVC 控制器操作方法导致空参数

我用的是thinkphp3.2.3为啥使用jquery的ajax接收不到post值

为啥 jquery ajax返回undefined

用jquery $.ajax 请求后台老是url %5Bobject%20Object%5D而报404错误,为啥?