2014-09-25 1 views
0

Мой WebAPI ожидает модель, как показано ниже:Свойство Datetime не является обязательным, что приводит к нулю модели.

Модель:

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}, ""); 

Но привязка к модели всегда равна нулю (на стороне webapi).

я вижу следующее Скрипач: {"datetime":"2014-09-25T07:22:56.7095909Z}"

Любые идеи, почему?

+2

- имя свойства «datetime» в модели и «дата» в запросе опечатки? –

ответ

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

Итак, чтобы использовать сериализатор Json в WebApi, просто сделайте new JsonMediaTypeFormatter().

+1

Ярмарка, отличная находка :) Молодцы. –

2

Изменить запрос:

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

В Скрипач, вы хотите, чтобы видеть это:

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

Так что будет совпадать с именем свойства в классе:

public DateTime datetime {get;set; }

Последовательность привязки должна быть в состоянии выбрать это из запроса и, используя отражение, найти свойство с именем «datetime» в экземпляре MyType и установить для него значение.

+3

Я предполагаю, что он просто разместил опечатку, иначе она не будет компилироваться. – DavidG

+0

Это просто опечатка –

+0

@ Джейсон Эванс: Я обновил вопрос. –