2013-05-16 32 views
0
// Server-side Model to bind 

    public class CurrentPipelineRequest 
    { 
     public List<string> Usernames { get; set; } 
    } 

// Controller 

[HttpPost] 
public HttpResponseMessage CurrentPipelineByMilestone(CurrentPipelineRequest currentPipelineRequest) 
{ 
    //..... 
} 

// Jquery/Ajax 

    var model = { 
      'Usernames' : JSON.stringify(["me", "you", "I"]) 
     }; 
    $.ajax({ 
     contentType: 'application/json', 
     type: 'POST', 
     url: 'api/Dashboard/CurrentPipelineByMilestone' 
     data: model, 
     success: function (data) { 
      alert('success'); 
     } 
}); 

當前,控制器操作參數「currentPipelineRequest」將爲空。Web API - 具有收集屬性的簡單Post模型不具有約束力

回答

2

您需要stringify整個模型而不是僅Usernames

var model = { 
     Usernames : ["me", "you", "I"] 
    }; 

$.ajax({ 
    contentType: 'application/json', 
    type: 'POST', 
    url: 'api/Dashboard/CurrentPipelineByMilestone' 
    data: JSON.stringify(model), 
    success: function (data) { 
     alert('success'); 
}); 
+0

我發誓我在之前的嘗試中嘗試過,哦,謝謝,現在正在工作:) – contactmatt

2

ASP.NET Web API中的綁定與ASP.NET MVC不完全相同。

但是,在ASP.NET Web API中,正文內容被視爲只能讀取一次的只進流。因此,如果Actions上有複雜的簽名,您需要從您希望的參數中指定。

,如果你所得到的參數構成的身體改變簽名:

public HttpResponseMessage CurrentPipelineByMilestone(
     [FromBody] CurrentPipelineRequest currentPipelineRequest) 

如果你正在從URI參數更改簽名:

public HttpResponseMessage CurrentPipelineByMilestone(
     [FromUri] CurrentPipelineRequest currentPipelineRequest) 

如果你所得到的然後將參數從uri和body更改爲:

public HttpResponseMessage CurrentPipelineByMilestone(
     [ModelBinder] CurrentPipelineRequest currentPipelineRequest) 

這裏是一個試圖implement MVC style binding in Web API的條款。請注意,我沒有自己嘗試過。

+0

感謝您的信息。在我的情況下,似乎只要我正確地將javascript模型串起來就可以讓action參數沒有工作。 – contactmatt

0

這其實是因爲你正在做一個POST而不是通過發送您的模型作爲一個JSON對象,因此該服務無法明白它。

嘗試這種情況:

var model = { 
      'Usernames' : ["me", "you", "I"] 
     }; 

var data = JSON.stringify(model); 

$.ajax({ 
    contentType: 'application/json', 
    type: 'POST', 
    url: 'api/Dashboard/CurrentPipelineByMilestone' 
    data: data, 
    success: function (data) { 
     alert('success'); 
    } 

});