我在一个没有改变的MVC4 Web API项目中有一个简单的ASP.Net Web API控制器,它有一个POST方法,它接受一个Values类。我做的时候:
POST / api / values ,主体为 {name:“somename”}
调用Values()构造函数而不是值(字符串名称)。通常,这不是问题,因为Name属性将具有公共集,并且Web API将在构造之后调用它。在这种情况下它是私有的,所以我得到一个默认的值实例。
如果我删除了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; }
}
}
我已经查看了许多其他网站中的Routing and Action Selection和WebAPI Parameter binding under the hood,但我不明白这种行为。
答案 0 :(得分:5)
你在谈论反序列化,而不是模型绑定。尝试将此属性添加到您要使用的构造函数中:
[JsonConstructor]
public Values(string name)
应该为Json.NET案例做这件事,但它不适用于XML。也许这就是你所关心的。