【问题标题】:ASP.Net Web API model constructor binding - Wrong constructor being calledASP.Net Web API 模型构造函数绑定 - 调用了错误的构造函数
【发布时间】:2013-05-25 08:26:03
【问题描述】:

我在一个未更改的 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; }
    }
}

我已经看过:Routing and Action SelectionWebAPI Parameter binding under the hood 以及许多其他网站,但我不理解这种行为。

【问题讨论】:

  • 我对此了解不多,但是您声称它应该调用的构造函数与您的 POST 正文没有相同的方法签名(您没有提供int 参数)。
  • @RobertHarvey 感谢您的关注。它不应该在那里。这是我在此处发布之前尝试的最后一件事。

标签: c# asp.net-web-api


【解决方案1】:

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

[JsonConstructor]
public Values(string name)

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

【讨论】:

  • 好点。我会试试这个(或类似的东西),然后发回详细信息。
  • 别忘了使用 Newtonsoft.Json;
  • 这确实有效。我们现在只做json。现在我知道这是一个反序列化问题,我确信如果需要,我也可以让它适用于 xml。谢谢!
  • 我没有发布 JSON,所以这不起作用。有没有其他方法可以做到这一点,还是我需要改变我发布内容的方式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2019-03-14
相关资源
最近更新 更多