2017-02-01 13 views
0

首先,讓我說剛纔已經發布的許多類似的問題,但我已經嘗試了所有的解決方案並且沒有快樂。將數據從jQuery Ajax調用傳遞給MVC ApiController操作正在丟失數據

我有一個MVC ApiController行動的簽名是:

public void Post([FromBody] Employee employee) 

我帶或不帶[FromBody]試過。

我Employee類有基本類型,整型,字符串,字符串,字符串的5名成員,雙

我打電話從一個單獨的域的行動(包括使用一個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", 

用不同的方式組合,以「字符串」我的員工對象:

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

    employee = JSON.stringify({ "employee": employee }); 
    employee = JSON.stringify(employee); 

萬一這與(作爲一個更簡單的例子),我也有這個方法對我的ApiControll呃:

public void Delete([FromBody] int employeeId) 

再次,我無法通過「所需」的方式傳遞employeeId。

我甚至無法獲得:

 data: { 
      employeeId: 100 
     }, 

工作!?!

我可以讓Delete方法工作,我將它更改爲[FromUri]並在調用Url中指定「?employeeId = 100」。

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

有沒有人有任何想法可以幫助我進步?

謝謝。

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

如果我使用郵差,刪除要求身份驗證,指定內容類型的「application/JSON」在頭 和在主體EMPLOYEEID = 100,郵差返回:

{ 
    "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

變化data這樣:

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

我試過了。再次使用dataType/contentType的所有組合。該方法被調用,但Employee對象的所有屬性在ApiController Action中仍具有默認的null,0值。 –

+1

嘗試添加'的contentType: '應用/ JSON的',數據類型: 「JSON」'你'$ .ajax'設置 – JohanP

+0

仍然在服務器上的員工對象有默認值: VAR員工= { 編號:100, 名字:「Fred」, 姓氏:「博客」 性別:男性, 工資:100000 }; $阿賈克斯({ 網址: 「HTTP:// ..., 類型: 」POST「, 頭:{ 」授權「: 」承載「 + sessionStorage.getItem(」 的accessToken「) }, contentType:「application/json」, dataType:「json」, data:JSON.stringify({employee:employee}), –

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 
    }, 
+0

**這有效**,但您似乎表明,這有點混亂。我認爲客戶端的一個stringify()選項會以我可以直接使用Employee對象的方式格式化數據。 –

+0

關於Delete()的公平評論我會稍後調查,我假設Post /放置應該是一樣的。 –

0

以下組合終於固定我的問題。

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

    employee = JSON.stringify(employee); 

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

的原因之一的我沒有在這個較早抵達的,是,我是傾向於圍繞數據:{...}用大括號。這導致它失敗。

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

相關問題