将数据从jQuery Ajax调用传递给MVC ApiController Action正在丢失数据

时间:2017-02-01 22:03:24

标签: javascript jquery ajax asp.net-apicontroller

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

我有一个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."
}

3 个答案:

答案 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在消息正文中工作。