首先,我要说的是,这里已经发布了很多类似的问题,但是我已经尝试了所有的解决方案而没有任何乐趣。
我有一个MVC ApiController Action,其签名是:
public void Post([FromBody] Employee employee)
无论有没有[FromBody],我都试过了。
我的Employee类有5个基类型成员,int,string,string,string,double
我从一个单独的域调用Action(在我的localhost上使用Cors),使用jQuery Ajax,如下所示:
$.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
},
// ...
这绝对正常。授权没有问题。 Controller上的Employee对象将填充此数据。但我想做的是将数据发送到一个更加结构化的数据库中。办法。所以我的数据看起来像这样:
data: {
employee: employee
},
我已经尝试了一切我能想到的格式化员工的方法。指定的所有组合:
contentType: "application/json; charset=utf-8",
dataType: "json",
结合不同的方式来" stringify"我的员工对象:
var employee = {
Id: 100,
FirstName: "Fred",
LastName: "Blogs",
Gender: "Male",
Salary: 100000
};
employee = JSON.stringify({ "employee": employee });
employee = JSON.stringify(employee);
如果这是相关的(作为一个更简单的例子)我在我的ApiController上也有这个方法:
public void Delete([FromBody] int employeeId)
同样,我无法在"期望"中传递employeeId。办法。
我甚至无法得到:
data: {
employeeId: 100
},
工作!?!
我可以让Delete方法工作,我将其更改为[FromUri]并指定"?employeeId = 100"在调用Url。
我希望在不同的电话中我可以更加一致,并且总是传递一个'对象'以JSON格式。
有没有人有任何可以帮助我进步的想法?
感谢。
有关删除电话的详细信息。
如果我使用Postman,删除身份验证要求,请指定Content-Type" application / json" 在标题和bodyId = 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."
}
答案 0 :(得分:1)
我不认为"删除"通过像" POST"因此,如果您使用以下类型调用ajax调用,[FromBody]将无法工作:"删除"。
至于员工的帖子,我看到过类似的问题。我能找到的唯一工作就是创建一个包装员工的包装类。
public class EmployeeWrapper {
public Employee employee {get; set;}
}
然后你将EmployeeWrapper作为Post方法的参数。
public void Post([FromBody] EmployeeWrapper employeeWrapper) {
Employee employee = employeeWrapper.employee;
...
这允许您使用ajax数据调用:
data: {
employee: employee
},
答案 1 :(得分:0)
将data
更改为:
data: JSON.stringify({ employee : employee })
答案 2 :(得分:0)
以下组合最终解决了我的问题。
var employee = {
Id: 100,
FirstName: "Fred",
LastName: "Blogs",
Gender: "Male",
Salary: 100000
};
employee = JSON.stringify(employee);
//...
contentType: "application/json",
data: employee,
//...
我之前没有达到这个原因的原因之一是我倾向于围绕数据:{...}用花括号。这导致它失败。
还设法以完全相同的方式让DELETE在消息正文中工作。