簡體   English   中英

將數據從jQuery Ajax調用傳遞到MVC ApiController Action將丟失數據

[英]Passing data from an jQuery Ajax call to an MVC ApiController Action is losing data

首先,我要說的是,這里已經發布了許多類似的問題,但是我嘗試了所有解決方案,並沒有感到高興。

我有一個MVC ApiController Action,其簽名是:

    public void Post([FromBody] Employee employee)

我嘗試過[FromBody],也可以不使用。

我的Employee類有5個基本類型的成員,即int,string,string,string,double

我正在使用jQuery Ajax從一個單獨的域(都在我的本地主機上使用Cors)調用Action,如下所示:

    $.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", 

結合不同的方法來“字符串化”我的員工對象:

    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],並在調用的URL中指定“?employeeId = 100”,則可以使Delete方法起作用。

我希望我可以在不同的調用中保持一致,並始終以JSON格式傳遞“對象”。

有人有什么想法可以幫助我進步嗎?

謝謝。

有關刪除呼叫的更多信息。

如果我使用Postman,則刪除身份驗證的要求,在標頭中指定Content-Type“ 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."
}

我不認為“ DELETE”會傳遞像“ POST”這樣的主體,因此,如果您正在調用類型為“ Delete”的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
    },

data更改為此:

data: JSON.stringify({ employee : employee })

以下組合最終解決了我的問題。

    var employee = {
        Id: 100,
        FirstName: "Fred",
        LastName: "Blogs",
        Gender: "Male",
        Salary: 100000
    };

    employee = JSON.stringify(employee);

    //...
    contentType: "application/json",
    data: employee,
    //...

我之所以沒有早點到達這個原因,是因為我傾向於用大括號包圍數據:{...}。 這導致它失敗。

還設法使DELETE在消息正文中以完全相同的方式工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM