Datetime属性未绑定,导致模型为null

本文关键字:模型 null 属性 绑定 Datetime | 更新日期: 2023-09-27 18:24:16

我的WebAPI需要一个如下的模型:

型号:

public class MyModel 
{
  public DateTime datetime {get;set; }
}

WebAction方法:

public IHttpActionResult Post([FromBody] MyModel model)

我正在使用RestSharp发送请求。

            var restRequest = new RestRequest(url, Method.POST)
            {
                RequestFormat = DataFormat.Json,
            };
            restRequest.AddBody(new MyModel {Datetime =DateTime.Now}, ""); 

但是模型绑定始终为null(在webapi端)。

我在Fiddler中看到以下内容:{"datetime":"2014-09-25T07:22:56.7095909Z}"

有什么想法吗?

Datetime属性未绑定,导致模型为null

将请求更改为:

restRequest.AddBody(new MyModel { datetime =DateTime.Now}, "");

在Fiddler中,您希望看到以下内容:

{"datetime":"2014-09-25T07:22:56.7095909Z}"

因为这将与类中属性的名称相匹配:

public DateTime datetime {get;set; }

然后,模型绑定应该能够从请求中获取它,并使用反射在MyType实例中找到一个名为"datetime"的属性,并为其设置一个值。

最后似乎new JsonMediaTypeFormatter {UseDataContractJsonSerializer = true};是罪魁祸首。

详细信息:

WebApiConfig类中,我尝试将XmlSerializer作为默认值,而不是JsonSerializer,后者是WebApi中的默认值。

但在不知不觉中,我设置了UseDataContractJsonSerializer = true。这才是罪魁祸首。

实际上,UseDataContractJsonSerializer主要用于支持WCF序列化。它序列化所有已标记为DataContract的模型属性。

这样做的问题是,此序列化程序希望dateepoch格式。

在关联中,日期-时间属性的行为与此处给定的相同。

我在这里的SO答案中提到了这一点,而这个SO答案更完美地解释了这一问题。

由于我使用的是为WCF设计的序列化程序,因此它希望日期为ASP.NET格式(例如'/Date(1234567890)'/.

注意,WebAPI中的默认序列化程序是NewtonSoft Json serializer。在这里阅读更多

因此,要在WebApi中使用Json串行器,只需单独执行new JsonMediaTypeFormatter()即可。