2

Во-первых, спасибо, что нашли время, чтобы прочитать это сообщение.Значение контроллера POST всегда равно NULL

Я создал свой первый asp.net 4.5 MVC4 Web Api, но значение, полученное в методе POST, всегда равно NULL.

Чтобы проверить метод POST api, я пробовал Fiddler и Google Chrome Simple REST Clinet, но результат всегда один и тот же.

Вот мой код:

контроллер (POST)

// POST api/Terminal 
    public HttpResponseMessage PostTerminal(Terminal terminal) 
    { 
     if (terminal == null) 
     { 
      return Request.CreateResponse(HttpStatusCode.BadRequest, terminal); 
     } 

     if (ModelState.IsValid) 
     { 
      db.Terminals.Add(terminal); 
      db.SaveChanges(); 

      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, terminal); 
      response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = terminal.Id })); 
      return response; 
     } 
     else 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
     } 
    } 

Модель Класс

public class Terminal 
    { 
     public int Id { get; set; } 
     [Required] 
     public int TerminalId { get; set; } 
     [Required] 
     public string Tag { get; set; } 
     [Required] 
     public DateTime TagDate { get; set; } 
    } 

В приведенном выше коде, значение, полученное в терминале методом POST всегда имеет значение NULL.

Вот команда, я использую для POST с помощью Fiddler:

Метод: POST

Адрес:

http://localhost:52036/api/terminal 

Заголовок:

Content-Type: application/json 
Host: localhost:52036 
Content-Length: 60 

тела:

{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12} 

----------- EDIT - 13-04-2014 14:56 -------------

Я изменил свой почтовый запрос Fiddler http, как указано в некоторых ответах на этот вопрос со следующими подробностями. Однако я продолжаю получать 500 HTTP-ошибок, и мой код API даже не доходит до контроллера при тестировании в режиме отладки VS2013.

Адрес

POST 
http://localhost:52036/api/terminal/ 

Заголовок

Content-Type: application/json; charset=utf-8 
Host: localhost:52036 
Content-Length: 62 

тела

{"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"} 

-------------- Редактировать 13/04/2012 20:38 -----------------

Хорошо, используя Google Chrome REST Client, я заметил следующее сообщение об ошибке: возвращение

{ "сообщение": "ошибка", "ExceptionMessage": "Недвижимость ' TerminalId' по типу«ClockingDemo.Models. Терминал "недействителен. Свойства с типом, помеченные как [Обязательно], также должны быть отмечены как [DataMember (IsRequired = true)]. Рассмотрим приписывание объявляющий тип с [DataContract] и свойство с [DataMember (= требуется копаться истинной)] "" ExceptionType ":" System.InvalidOperationException " "StackTrace.":" на System.Web.Http .Validation.Validators.ErrorModelValidator.Validate (ModelMetadata метаданных, контейнер объекта) \ г \ п на System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate (ModelMetadata метаданные, validationContext validationContext, контейнер объекта) \ г \ п
на System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren (ModelMetadata метаданные, ValidationContext validationContext, контейнер объекта) \ r \ n на System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties (ModelMetadata метаданных, ValidationContext validationContext) \ г \ п на System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren (ModelMetadata метаданных, ValidationContext validationContext, контейнер объектов) \ г \ п
на System.Web.Http.Validation.DefaultBodyModelValidator.Validate (Object модель, тип, тип ModelMetadataProvider metadataProvider, HttpActionContext ActionContext, Строка keyPrefix) \ г \ п на System.Web.Http. ModelBinding.FormatterParameterBinding. <> c__DisplayClass1.b__0 (объект модель) \ r \ n на System.Threading.Tasks.TaskHelpersExtensions. <> c__DisplayClass36 FUNC, CancellationToken CancellationToken) "}

Я думаю, что проблема исходит из того, что мой INTEGER свойство TerminalId определяется как [Требуется]. У меня есть чувство может возникнуть проблема с установкой свойства non-NULLABLE и [Обязательно].

Очень подходит для предложений.

----------------- ОТВЕТ ---------------

я, наконец, наткнулся на эту нить, решил проблему для меня. DataAnnotation for Required property

Просто вставьте в файл Global.asax:

GlobalConfiguration.Configuration.Services.RemoveAll(
    typeof(System.Web.Http.Validation.ModelValidatorProvider), 
    v => v is InvalidModelValidatorProvider); 

Я по-прежнему открыт для других решений, если вы считаете, что есть лучший способ.

+0

В отличие от сайтов форума, мы не используем "Спасибо" или "Любая помощь приветствуется", или подписи [так]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+2

Отмечено. (Должен ли я сказать спасибо за указание на это?) – RobHurd

+0

В отличие от сайтов на форуме мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -Удалена-от-сообщений). –

ответ

0

В Скрипач вы должны использовать, как показано ниже

Ваш запрос органу нравится этот { "TerminalId": 123, "Метка": "222", "тэг или дата": "2014-04-13 04: 22:12 "} и в вашем заголовке запроса вам необходимо пройти тип контента, подобный этому Content-Type: application/json; charset = utf-8

+0

К сожалению, это все еще не работает @Naveen. Я получаю 500 ошибок. При запуске моего API в режиме отладки код даже не доходит до контроллера, чтобы остановиться в точке останова. Посмотрите мой оригинальный вопрос, я опубликовал редактирование с предложенной вами модификацией. – RobHurd

0

В моем случае у меня есть гибридные веб-формы ASP.NET с MVC и веб-API.

Просто решил так:

public HttpResponseMessage PostTerminal(JObject jsonMessage) 
{ 
     var terminal = jsonMessage.ToObject<Terminal>(); 
     if (terminal == null) 
     { 
      return Request.CreateResponse(HttpStatusCode.BadRequest, terminal); 
     } 

     ... 
    } 

Ссылки: http://weblog.west-wind.com/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API-Controller-Methods