为什么POST请求方法返回null而GET请求返回正确的对象



我的控制器代码:

[HttpPost]
public async Task<JsonResult> GetWebsite(int Id)
{
var website = await _uWebsitesService.GetWebsite(Id);
return (website == null ? this.Json("Website Not Found") : this.Json(website));
}

这是ajax:

$(".edit-website-btn").on("click", function () {
let id = $(this).attr('data-id');
$.ajax({
type: "POST",
url: "/userpanel/GetWebsite/",
data: { Id: id },
dataType: "json",
contentType: "application/json",
success: function (result) {
console.log(result);
},
error: function (error) {
console.log(error);
},
})
})

当我检查控制台日志的结果,它是空的,当请求类型是post,但当我改变ajax请求和控制器方法GET它返回正确的对象。

这是因为对于你的post方法,你使用的是应用程序/json内容,不发送id到一个动作,所以动作是使用id=0默认情况下,不能得到任何数据。Get操作具有正确的id并返回数据。您可以尝试通过删除contentType: "application/json">

来修复ajax。
$.ajax({
type: "POST",
url: "/userpanel/GetWebsite/",
data: { Id: id },
dataType: "json",
.....

,但我认为最好使用GET

$.ajax({
type: "GET",
url: "/userpanel/GetWebsite?id="+id,
dataType: "json",
...

也许你也应该试试这个

let Id = $(this).data('id');
//or
let Id = this.getAttribute('data-id');

ajax调用中的data参数是一个对象,它恰好有一个名为Id的属性,具有您想要的值。

然而,你的c#方法期望只是一个整数,而不是一个具有属性名为&;id &;的对象

。只需将JavaScript更改为只发送整数。

data: id,

也有助于c#的绑定,你还应该指定参数来自请求体。这在技术上是可选的,但可能有助于可维护性,并确保您的值不会意外地来自其他来源(如rouge查询参数)。

public async Task<JsonResult> GetWebsite([FromBody] int Id)

如果你需要在POST调用中传递多个值,你需要在c#中创建一个类并绑定它,而不是绑定int。

最新更新