[英]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.