POST JSON с контроллером API MVC 4
У меня есть этот код:
$.ajax({
type: "POST",
url: "/api/slide",
cache: false,
contentType: "application/json; charset=utf-8",
data: '{"Title":"fghfdhgfdgfd"}',
dataType: "json",
Это мой контроллер:
public class SlideController : ApiController
{
// POST /api/Slide
public void Post(string Title)
{
}
Когда я запускаю код и вызываю /api/Slide, [Title] не имеет данных и имеет значение null.
Как разместить JSON в контроллере API?
POST http://127.0.0.2:81/api/slide HTTP/1.1
Host: 127.0.0.2:81
Connection: keep-alive
Content-Length: 18
Origin: http://127.0.0.2:81
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://127.0.0.2:81/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Title=fghfdhgfdgfd
Ответы
Ответ 1
Определите модель представления:
public class SlideViewModel
{
public string Title { get; set; }
}
то ваше действие с контроллером примет эту модель представления в качестве аргумента:
public class SlideController : ApiController
{
// POST /api/Slide
public void Post(SlideViewModel model)
{
...
}
}
наконец, вызовите действие:
$.ajax({
type: 'POST',
url: '/api/slide',
cache: false,
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ title: "fghfdhgfdgfd" }),
success: function() {
...
}
});
Причина этого в том, что простые типы, такие как строки, связаны с URI. Я также приглашаю вас прочитать следующую статью о привязке модели в веб-API.
Ответ 2
Убедитесь, что объект, который вы пытаетесь преобразовать, имеет конструктор по умолчанию (пустой).
Правило большого пальца: если вы хотите десериализовать объект, вам нужно сделать его простым для объектов, которые будут созданы. Эти рекомендации могут помочь:
-
Все свойства, которые должны передаваться , должны быть общедоступными
-
объект должен быть построен без каких-либо параметров.
Эта строка/объект JSON, например:
{ Name: "John Doe", Phone: "123-456-7890", Pets: [ "dog", "cat", "snake" ] }
может быть преобразован в объект из следующего класса:
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
}
или этот:
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
public Person() {}
public Person(string name, string phone) {
Name = name;
Phone = phone;
}
}
или этот:
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
public Person() {}
}
но не этот
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
public Person(string name, string phone) {
Name = name;
Phone = phone;
}
}
Теперь пусть ASP.NET MVC 4 сделает остальные
public class PersonController : ApiController
{
// .. other actions
public HttpResponseMessage PostPerson(Person person)
{
if ( null != person)
// CELEBRATE by doing something with your object
else
// BE SAD and throw and exception or pass an error message
}
// .. other actions
}
Если ваш класс не может иметь конструктор по умолчанию или если у вас нет доступа к исходному коду для класса, вы можете создать класс адаптера, который
- имеет конструктор по умолчанию
- предоставляет те свойства, которые должны быть общедоступными.
Используя класс Person выше, не имеющий конструктора по умолчанию, адаптер может выглядеть как
public class PersonAdapter {
public Person personAdaptee;
public string Name {
get { return personAdaptee.Name; }
set { personAdaptee.Name = value }
}
public string Phone {
get { return personModel.Phone; }
set { personModel.Phone = value; }
}
public string[] Pets {
get { return personAdaptee.Pets; }
set {personAdaptee.Pets = value }
}
public PersonAdapter() {
personAdaptee = new Person("", "", null);
}
}
Теперь пусть ASP.NET MVC 4 сделает остальные
public class PersonController : ApiController
{
// .. other actions
public HttpResponseMessage PostPerson(PersonAdapter person)
{
if ( null != person)
// CELEBRATE by doing something with your object
else
// BE SAD and throw and exception or pass an error message
}
// .. other actions
}
Ответ 3
Попробуйте следующее:
$.ajax({
type: "POST",
url: "/api/slide",
data: { Title: "fghfdhgfdgfd" }
});
Это кавычки вокруг атрибута data, которые вызывают это:
i.e → данные: {Название: "fghfdhgfdgfd" }
не → данные: ' {Название: "fghfdhgfdgfd" }
UPDATE:
Также ваш контроллер кажется немного странным, хотя это трудно сказать, не видя вашу маршрутизацию и т.д.
Я бы ожидал увидеть нечто подобное:
public class SlideController : ApiController
{
public HttpResponseMessage PostSlide(string Title)
{
// Do your insert slide stuff here....
string uri = Url.Link("DefaultApi", new { id = item.Id });
response.Headers.Location = new Uri(uri);
return response;
}
}
Очевидно, вам также потребуется обновить URL-адрес в вашем jQuery.
Взгляните сюда:
http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
ДРУГОЕ ОБНОВЛЕНИЕ:
Было бы обычно создавать объект CLR, чтобы он соответствовал вашему Json, и использовать привязку модели MVC для непосредственного привязки к этому. Если вы не хотите этого делать, вы можете привязываться к объекту и десериализоваться в словаре:
// POST api/values
public void Post(object json)
{
Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json.ToString());
var x = values["Title"];
}
Ответ 4
Вставьте параметр действия в FromBody i.e:
public class SlideController : ApiController
{
// POST /api/Slide
public void Post([FromBody]string Title)
{
}
}
Ответ 5
$.ajax({
type: 'POST',
url: '/api/slide',
cache: false,
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ title: "fghfdhgfdgfd" }),
success: function() {
...
}
});
Контроллер
public class SlideController : ApiController
{
// POST /api/Slide
public void Post(string Title)
{
}
Ваш URL недействителен, url должен указать действие Опубликовать в Слайд.
отредактируйте свой url для url: "~/ControllerName/ActionName
" в этом контексте должно быть Url:"~/Slide/Post"