ASP.Net Web API模型构造函数绑定 - 正在调用错误的构造函数

Jer*_*rry 3 c# asp.net-web-api

我在一个没有改变的MVC4 Web API项目中有一个简单的ASP.Net Web API控制器,它有一个POST方法,它接受一个Values类.我做的时候:

POST/api /值,主体为{name:"somename"}

调用Values()构造函数而不是值(字符串名称).通常,这不是问题,因为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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经看过:路由和动作选择以及WebAPI参数绑定在许多其他站点之下,但我不明白这种行为.

You*_*oui 5

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

[JsonConstructor]
public Values(string name)
Run Code Online (Sandbox Code Playgroud)

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

  • 不要忘记使用Newtonsoft.Json; (3认同)