Javascript 将数据从jQueryAjax调用传递到MVCApicontroller操作会丢失数据
首先,我要说的是,这里已经发布了许多类似的问题,但我已经尝试了所有的解决方案,但没有任何乐趣 我有一个MVC ApiController操作,其签名为:Javascript 将数据从jQueryAjax调用传递到MVCApicontroller操作会丢失数据,javascript,jquery,ajax,asp.net-apicontroller,Javascript,Jquery,Ajax,Asp.net Apicontroller,首先,我要说的是,这里已经发布了许多类似的问题,但我已经尝试了所有的解决方案,但没有任何乐趣 我有一个MVC ApiController操作,其签名为: public void Post([FromBody] Employee employee) 我试过用或不用[FromBody] 我的Employee类有5个基本类型的成员,int、string、string、string、double 我使用jQuery Ajax从一个单独的域(都在我的本地主机上使用Cors)调用该操作,如下所示:
public void Post([FromBody] Employee employee)
我试过用或不用[FromBody]
我的Employee类有5个基本类型的成员,int、string、string、string、double
我使用jQuery Ajax从一个单独的域(都在我的本地主机上使用Cors)调用该操作,如下所示:
$.ajax({
url: "http://localhost:55555/api/Employees",
type: "POST",
headers: {
"Authorization": "Bearer " + sessionStorage.getItem("accessToken")
},
data: {
Id: 100,
FirstName: "Fred",
LastName: "Blogs",
Gender: "Male",
Salary: 100000
},
// ...
这工作绝对正常。授权没有问题。控制器上的Employee对象将填充此数据。但我想做的是以一种更“结构化”的方式发送数据。因此,我的数据将如下所示:
data: {
employee: employee
},
我已尝试了所有我能想到的方法来格式化员工。指定了以下所有组合:
contentType: "application/json; charset=utf-8",
dataType: "json",
结合不同的“字符串化”我的员工对象的方法:
var employee = {
Id: 100,
FirstName: "Fred",
LastName: "Blogs",
Gender: "Male",
Salary: 100000
};
employee = JSON.stringify({ "employee": employee });
employee = JSON.stringify(employee);
如果这是相关的(作为一个更简单的例子),我的ApicController上也有这个方法:
public void Delete([FromBody] int employeeId)
同样,我无法以“期望的”方式通过employeeId
我甚至不能得到:
data: {
employeeId: 100
},
工作
如果我将Delete方法更改为[FromUri],并在调用Url中指定“?employeeId=100”,则可以使Delete方法正常工作
我希望我可以在不同的调用中更加一致,并且总是以JSON格式传递一个“对象”
有人有什么想法可以帮助我进步吗
谢谢
有关删除呼叫的详细信息
如果我使用Postman,请删除身份验证要求,指定内容类型“application/json”
在标题和正文中的employeeId=100时,Postman返回:
{
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'employeeId' of non-nullable type 'System.Int32' for method 'Void Delete(Int32)' in 'WebApi.Controllers.EmployeesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}
将数据更改为:
data: JSON.stringify({ employee : employee })
我不认为“DELETE”像“POST”一样传递一个body,因此如果您使用“DELETE”类型调用ajax调用,[FromBody]将不起作用
至于员工post调用,我也看到了类似的问题。我能找到的唯一解决办法是创建一个包装类来包装员工
public class EmployeeWrapper {
public Employee employee {get; set;}
}
然后将EmployeeWrapper作为Post方法的参数
public void Post([FromBody] EmployeeWrapper employeeWrapper) {
Employee employee = employeeWrapper.employee;
...
这允许您使用ajax数据调用:
data: {
employee: employee
},
以下组合最终解决了我的问题
var employee = {
Id: 100,
FirstName: "Fred",
LastName: "Blogs",
Gender: "Male",
Salary: 100000
};
employee = JSON.stringify(employee);
//...
contentType: "application/json",
data: employee,
//...
其中一个原因是我没有在前面提到,因为我倾向于用大括号括住数据:{…},这导致它失败
还以完全相同的方式在邮件正文中成功执行了删除操作。我尝试了此操作。再次使用dataType/contentType的所有组合。调用了该方法,但Employee对象的所有属性在ApiController操作中仍有其默认的null、0值。请尝试添加
contentType:'应用程序/json',数据类型:“json”
到您的$。ajax
设置服务器上的employee对象仍然具有默认值:var employee={Id:100,FirstName:“Fred”,LastName:“Blogs”Gender:“Male”,Salary:100000};$.ajax({url:http://...,类型:“POST”,标题:{“Authorization”:“Bearer”+sessionStorage.getItem(“accessToken”)},内容类型:“application/json”,数据类型:“json”,数据:json.stringify({employee:employee}),这是有效的。但是,正如您所指出的,这有点混乱。我认为客户端上的stringify()选项之一将以我可以直接使用Employee对象的方式格式化数据。关于Delete()的合理评论。我将在稍后进行调查。我假设Post/Put也会起到同样的作用。