2017-03-02 100 views
0

我有一個ASP.NET MVC 5 web應用程序,它使用HTTP POST將數據發送到ASP.NET Web API 2操作。 Web API操作被擊中,但數據全部爲空。如何正確地將json數據發佈到Web API 2操作

職位由發送:

var url = 'http://MyWebApi/api/MyController/MyAction/1'; 
var obj = { pamA: 'a', pamB: 1 }; 
var data = { json: ko.toJSON(obj) }; 
// var data = ko.toJSON(obj); // tried this too, but same problem. 

$.ajax({ 
    type: 'post', 
    dataType: 'json', 
    url: url, 
    data: data, 
}); 

我的Web API操作是:

[System.Web.Http.HttpPost] 
[System.Web.Http.Route("{id:int}")] 
[ResponseType(typeof(Models.MyModel))] 
[EnableCors(origins: "*", headers: "*", methods: "*")] 
public IHttpActionResult Post(int id, Models.MyModel json){ 
    return Ok(200); // break point is hit but json doesn't have the data sent from client. 
} 

,我的模式是:

public class MyModel{ 
    public string pamA {get; set;} 
    public int pamB {get; set;} 
} 
+0

嘗試:'VAR數據= ko.toJSON(OBJ);' –

+0

@ChrisPratt,我試過了,但還是同樣的問題。謝謝。 –

+0

好的,接下來,在AJAX調用中使用'contentType:「application/json」'。 –

回答

1

首先,我建議爲清晰起見,你標記您的參數來自您的網絡操作的位置。像這樣的東西

[System.Web.Http.HttpPost] 
[System.Web.Http.Route("{id:int}")] 
[ResponseType(typeof(Models.MyModel))] 
[EnableCors(origins: "*", headers: "*", methods: "*")] 
public IHttpActionResult Post([FromUri]int id, [FromBody]Models.MyModel json){ 
    return Ok(200); // break point is hit but json doesn't have the data sent from client. 
} 

現在,這不是你的問題,只是我迷戀。無論如何,我認爲你的問題源於你的ajax請求。

var url = 'http://MyWebApi/api/MyController/MyAction/1'; 
var obj = { pamA: 'a', pamB: 1 }; 
var data = { json: ko.toJSON(obj) }; 

$.ajax({ 
    type: 'post', 
    dataType: 'json', 
    url: url, 
    data: data, 
}); 

應該是:

var url = 'http://MyWebApi/api/MyController/MyAction/1'; 
var data = { pamA: 'a', pamB: 1 }; 

$.ajax({ 
    type: 'post', 
    dataType: 'json', 
    url: url, 
    data: data, 
}); 

你爲MyModel對象期待JSON有場PAMA和PAMB。但你的json對象實際上看起來像這樣{「json」:{「pamA」:「a」,「pamB」:1}}你的json說對象應該包含一個名爲「json」的屬性映射到具有屬性pamA和pamB的對象。爲了讓您的MyModel對象能夠映射到您當前正在發送它的json,它必須看起來像這樣。

public class OtherModel { 
     public MyModel json; 
} 

但我建議你只是用 「JSON」 場做掉,讓你的JSON請求是這樣的:{奧巴馬: 'A',PAMB:1}

+0

更改var data = {pamA:'a',pamB:1}使其工作。位置標記[FromUri]是可選的。 –

+0

是的,我知道他們是可選的,我只是說這是一個建議。它是我喜歡做的事情,以明確數據來自何處。 所以我回答了這個問題,並沒有upvote? – victor

1

對於jQuery的ajax方法,dataType指定你期望的迴應,所以你可能仍然需要這個。 contentType選項指定請求正文的格式,默認爲application/x-www-form-urlencoded,因此您需要指定application/json

$.ajax({ 
    type: 'post', 
    dataType: 'json', 
    contentType: 'application/json', 
    url: url, 
    data: data, 
});