Web API模型绑定

时间:2012-08-08 10:04:14

标签: c# asp.net-web-api wcf-web-api

鉴于ASP.NET 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。

如何使模型绑定也包含路径数据中的值?我不想为看似常见的用例编写自定义模型绑定器。任何想法将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:10)

完成您正在寻找的内容的最简单方法就是向您的方法添加另一个参数,并指定哪个参数来自请求的哪个部分。

示例:

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

现在/examples/{id}的路由将成功绑定 - 因为Example方法在URI中有一个名为id的参数。要填充模型,您也可以在其中传递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

答案 1 :(得分:5)

我们的内置ModelBinding基础结构不支持URI和body的对象的部分绑定。但是,您可以实现自定义IActionValueBinder来完成此任务。例如,请参阅博文http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx

答案 2 :(得分: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

答案 3 :(得分:0)

我不认为默认的绑定器可以将您的Id路由值与您的Model Id属性相关联,所以无论d1k_is的答案是什么,我都害怕;无论是编写自己的绑定器(或许你可以写一个更通用的绑定器? - 如果你有一个DomainEntity超类或类似的东西......)