15

给定 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

4 回答 4

11

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

例子:

[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

于 2012-12-20T18:30:18.913 回答
5

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

于 2012-08-24T22:05:15.120 回答
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

于 2012-08-08T10:37:43.987 回答
0

我不认为默认绑定器可以将您的 Id 路由值与您的 Model Id 属性相关联,因此,无论 d1k_is 答案是否尽可能好,恐怕;要么写你自己的活页夹(你也许可以写一个更通用的活页夹?-如果你有一个 DomainEntity 超类或类似的东西......)

于 2012-08-08T11:24:19.350 回答