Javascript 将数据从jQueryAjax调用传递到MVCApicontroller操作会丢失数据

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)调用该操作,如下所示:

首先,我要说的是,这里已经发布了许多类似的问题,但我已经尝试了所有的解决方案,但没有任何乐趣

我有一个MVC ApiController操作,其签名为:

    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也会起到同样的作用。