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

时间:2014-09-25 08:04:54

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

我的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}"

任何想法为什么?

2 个答案:

答案 0 :(得分:2)

将请求更改为:

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

在Fiddler,你想看到这个:

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

因为那将匹配您班级中的属性名称:

public DateTime datetime {get;set; }

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

答案 1 :(得分:2)

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

详细信息:

WebApiConfig上课时,我尝试将XmlSerializer设为默认值JsonSerializer,而不是WebApi中的默认值{。}}。

但在不知不觉中我设置了UseDataContractJsonSerializer = true。结果证明这是罪魁祸首。

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

问题是,此序列化程序希望date采用epoch格式。

在连线中,日期时间属性的行为与给定的here相同。

我在回答here中提到了这个问题,而这个回答here更能说明这一点。

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

请注意WebAPI中的默认序列化程序是NewtonSoft Json Serializer。阅读here

中的更多内容

因此,要在WebApi中使用Json序列化程序,只需单独执行new JsonMediaTypeFormatter()