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

Мой WebAPI ожидает модель, как показано ниже:

Модель:

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

Метод веб-действия:

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).

В Fiddler я вижу следующее: {"datetime":"2014-09-25T07:22:56.7095909Z}"

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


person now he who must not be named.    schedule 25.09.2014    source источник
comment
Является ли имя свойства datetime в модели и Date в запросе опечаткой?   -  person Dirk Trilsbeek    schedule 25.09.2014


Ответы (2)


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

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

В Fiddler вы хотите видеть это:

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

Поскольку это будет соответствовать имени свойства в вашем классе:

public DateTime datetime {get;set; }

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

person Jason Evans    schedule 25.09.2014
comment
Я предполагаю, что он просто опубликовал опечатку, иначе он не скомпилировался бы. - person DavidG; 25.09.2014
comment
Можете обновить вопрос значениями, которые вы сейчас видите в Fiddler, пожалуйста? Это точно не может быть {"Date":"2014-09-25T07:22:56.7095909Z}"? В качестве примечания, хотя это просто опечатка, это имело серьезные последствия в отношении того, можно ли успешно ответить на этот вопрос. - person Jason Evans; 25.09.2014
comment
@JasonEvans: Спасибо. Я обновил вопрос. Кроме того, это потому, что мой webapi использует другой dateformat ? - person now he who must not be named.; 25.09.2014
comment
Не могли бы вы удалить атрибут [FromBody] и сообщить нам, что произойдет. Что в итоге? Есть разница? - person Jason Evans; 25.09.2014
comment
@JasonEvans: К сожалению, привязка модели по-прежнему недействительна. Сейчас я загружу сюда очень простой образец через несколько секунд. - person now he who must not be named.; 25.09.2014
comment
Что произойдет, если вы измените метод API на public IHttpActionResult Post([FromBody] DateTime datetime)? Я читал этот encosia.com/using -jquery-to-post-frombody-parameters-to-web-api, в котором есть несколько советов. - person Jason Evans; 25.09.2014
comment
@JasonEvans: Спасибо за помощь. Наконец-то разобрался и дал подробное объяснение ниже :) - person now he who must not be named.; 26.09.2014

Наконец кажется, что new JsonMediaTypeFormatter {UseDataContractJsonSerializer = true}; оказался виновником.

Подробнее:

В классе WebApiConfig я попытался сделать XmlSerializer по умолчанию вместо JsonSerializer, который используется по умолчанию в WebApi.

Но по незнанию я установил UseDataContractJsonSerializer = true. Это оказалось виновником.

Фактически, UseDataContractJsonSerializer в основном используется для поддержки сериализации WCF. Он сериализует все свойства модели, которые помечены как DataContract.

Проблема в том, что этот сериализатор ожидает, что date будет в формате epoch.

В сети свойство даты и времени ведет себя так, как указано здесь.

Я упомянул об этом в ответе SO здесь и этом ответе SO < href="https://stackoverflow.com/questions/11105856/send-json-date-to-wcf-service">здесь объясняет это еще красивее.

Поскольку я использовал сериализатор, предназначенный для WCF, он ожидает дату в формате ASP.NET (например, \/Date(1234567890)\/.).

Обратите внимание, что сериализатором по умолчанию в WebAPI является NewtonSoft Json Serializer. Подробнее читайте в здесь< /а>

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

person now he who must not be named.    schedule 26.09.2014