Во-первых, спасибо, что нашли время, чтобы прочитать это сообщение.Значение контроллера 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);
Я по-прежнему открыт для других решений, если вы считаете, что есть лучший способ.
В отличие от сайтов форума, мы не используем "Спасибо" или "Любая помощь приветствуется", или подписи [так]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –
Отмечено. (Должен ли я сказать спасибо за указание на это?) – RobHurd
В отличие от сайтов на форуме мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -Удалена-от-сообщений). –