2012-08-08 136 views
13

考慮到的ASP.NET Web API路線:的Web API模型綁定

example/{Id} 

映射到以下ApiController操作方法:

public void Example(Model m) 
{ 
    ... 
} 

隨着模型類定義爲:

public class Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

當我發佈JSON { "Name": "Testing" }到URL /example/123然後Id屬性的Model對象沒有綁定。它仍然是0而不是123.

如何讓模型綁定還包含來自路徑數據的值?我寧願不必爲常見用例編寫自定義模型綁定器。任何想法將不勝感激。謝謝!

回答

3

建議的過程通常是發佈到/example而不是/example/{id}。 (雖然使用Web API,他們通常使用/api/{controller}

退房表中途下此頁:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

還要檢查「插入用的ASP.NET Web API的紀錄」這個鏈接 - http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx

+0

如果我正在推送資源,該怎麼辦?在這種情況下,我不想從URL中刪除ID。 – 2012-08-08 10:51:28

+2

在這種情況下,您需要將它作爲您的動作的單獨參數'(int id,Model,model)'不是我所知道的最佳解決方案。 – dkarzon 2012-08-08 10:59:26

0

我不認爲默認聯編程序可以將您的Id路由值與您的模型ID屬性相關聯,因此無論d1k_is的答案如何,恐怕都是如此;或者編寫自己的聯編程序(你可能可以寫一個更通用的聯編程序,也許?如果你有像DomainEntity超類或類似的東西...)

10

完成要查找的內容的最簡單方法就是向您的方法添加另一個參數,並指定哪個參數來自請求的哪一部分。

例子:

[HttpPost] 
public void Example([FromUri]int id, [FromBody]Model m) { 
    // ... 
} 

現在你的/examples/{id}路線將成功能夠綁定 - 因爲Example方法有一個名爲id參數,它正在尋找的URI。要填充你的模型,你可以通過ID在那裏爲好,或者做類似如下:

[HttpPost] 
public void Example([FromUri]int id, [FromBody]Model m) { 
    m.Id = id; // Make sure the model gets the ID as well. 
} 

然後,只需在{ "Name": "Testing" }發佈到/example/123爲您上面提到。