3

我在一个未更改的 MVC4 Web API 项目中有一个简单的 ASP.Net Web API 控制器,该项目有一个采用 Values 类的 POST 方法。当我做一个:

POST /api/values的主体为{ name: "somename" }

Values() 构造函数被调用,而不是 Values(string name) 一个。通常,这不是问题,因为 Name 属性会有一个公共集,Web API 会在构造后调用它。在这种情况下,它是私有的,所以我得到了一个默认的 Values 实例。

如果我删除 Values(int) ctor,那么它会调用 Values(string) ctor。

ModelBinding 没有选择带有 name 参数的 ctor 是否有原因?

这是示例代码:

using System.Web.Http;

namespace WebAPIPlayground.Controllers
{
    public class ValuesController : ApiController
    {
        public void Post(Values value)
        {
            var a = value.ID; // == 0
            var b = value.Name; // == null
        }
    }

    public class Values
    {
        public int ID { get; private set; }
        public string Name { get; private set; }

        private Values() { }
        public Values(int id) { ID = id; }
        public Values(string name) { Name = name; }
    }
}

我已经看过:路由和操作选择以及许多其他站点的引擎盖下的 WebAPI 参数绑定,但我不理解这种行为。

4

1 回答 1

5

您在这里谈论的是反序列化,而不是模型绑定。尝试将此属性添加到您要使用的构造函数:

[JsonConstructor]
public Values(string name)

这应该适用于 Json.NET 案例,但它不适用于 XML。也许这就是你所关心的。

于 2013-05-29T22:27:34.523 回答