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}"
有什么想法吗?
将请求更改为:
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
的模型属性。
这样做的问题是,此序列化程序希望date
为epoch
格式。
在关联中,日期-时间属性的行为与此处给定的相同。
我在这里的SO答案中提到了这一点,而这个SO答案更完美地解释了这一问题。
由于我使用的是为WCF
设计的序列化程序,因此它希望日期为ASP.NET格式(例如'/Date(1234567890)'/.
)
注意,WebAPI
中的默认序列化程序是NewtonSoft Json serializer。在这里阅读更多
因此,要在WebApi
中使用Json串行器,只需单独执行new JsonMediaTypeFormatter()
即可。