Web API模型绑定

And*_*vey 13 c# wcf-web-api asp.net-web-api

给定ASP.NET Web API路由:

example/{Id}
Run Code Online (Sandbox Code Playgroud)

其映射到以下ApiController操作方法:

public void Example(Model m)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

模型类定义为:

public class Model
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我张贴JSON { "Name": "Testing" }的URL /example/123,然后Id将财产Model对象未绑定.它保持为0而不是123.

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

Tro*_*ord 10

完成所需内容的最简单方法是向方法中添加另一个参数,并指定哪个参数来自请求的哪个部分.

例:

[HttpPost]
public void Example([FromUri]int id, [FromBody]Model m) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在你的路由/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.
}
Run Code Online (Sandbox Code Playgroud)

然后,只需在发布{ "Name": "Testing" }/example/123你上面提到.


小智 5

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


dka*_*zon 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

  • 在这种情况下,您需要将其作为操作“(int id,Model,model)”的单独参数,这不是我所知道的最佳解决方案。 (2认同)