2013-05-29 51 views
3

我有一個POST方法,需要一個值類的其餘部分不變MVC4的Web API項目有一個簡單的ASP.Net的Web API控制器。當我做:ASP.Net的Web API模型構造綁定 - 錯誤的構造函數被調用

POST/API /值身體{名稱: 「somename」}

的值()構造函數被調用,而不是值(字符串名稱)之一。通常,這不是問題,因爲Name屬性會有一個公共集合,並且Web API將在構建後調用它。在這種情況下它是私有的,所以我得到了一個默認的值實例。

如果我刪除值(INT)構造函數,然後它調用值(字符串)構造函數。

是否有一個原因ModelBinding不選擇具有name參數的構造函數?

這裏的示例代碼:

using System.Web.Http; 

namespace WebAPIPlayground.Controllers 
{ 
    public class ValuesController : ApiController 
    { 
     public void Post(Values value) 
     { 
      var a = value.ID; // == 0 
      var b = value.Name; // == null 
     } 
    } 

    public class Values 
    { 
     public int ID { get; private set; } 
     public string Name { get; private set; } 

     private Values() { } 
     public Values(int id) { ID = id; } 
     public Values(string name) { Name = name; } 
    } 
} 

我已經看了看:許多其他網站中Routing and Action SelectionWebAPI Parameter binding under the hood,但我不明白這種行爲。

+1

我不知道很多關於這一點,但你要求它應該叫不具有相同的方法簽名爲您的POST主體構造函數(你沒有提供一個'int'參數)。 –

+0

@RobertHarvey感謝沒收。它本不應該在那裏。這是我在發佈之前嘗試的最後一件事情之一。 – Jerry

回答

3

您在這裏談論反序列化,而不是模型綁定。嘗試添加此屬性要已經使用的構造:

[JsonConstructor] 
public Values(string name) 

應該這樣做的Json.NET情況下,但它不會在XML工作。也許這就是你所關心的。

+0

好點。我會試試這個(或類似的東西),併發布後的細節。 – Jerry

+3

不要忘記使用Newtonsoft.Json; – John

+0

這確實奏效。我們現在只做json。現在我知道這是一個反序列化問題,我相信如果需要的話,我也可以將它用於xml。謝謝! – Jerry

相關問題