2012-08-08 104 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为您上面提到。