EDIT : 31.10.2017
Цей же код / підхід буде працювати і для Asp.Net Core 2.0 . Основна відмінність полягає в тому, що в ядрі asp.net і веб-контролери api, і контролери Mvc об'єднуються в єдину модель контролера. Таким чином , ваш тип значення може бути IActionResult
або один з його реалізації (Ex: OkObjectResult
)
Використовуйте
contentType:"application/json"
Вам потрібно використовувати JSON.stringify
метод для перетворення його в рядок JSON, коли ви надсилаєте його,
І палітурка моделі прив’яже дані json до об'єкта класу.
Наведений нижче код буде добре працювати (перевірено)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Результат
contentType
властивість повідомляє серверу, що ми надсилаємо дані у форматі JSON. Оскільки ми надіслали структуру даних JSON, прив'язка моделі відбудеться належним чином.
Якщо ви переглянете заголовки запиту ajax, ви можете побачити, що Content-Type
значення встановлено якapplication/json
.
Якщо ви не вказали явно contentType, він буде використовувати тип вмісту за замовчуванням, який є application/x-www-form-urlencoded;
Редагуйте листопада 2015 року, щоб вирішити інші можливі проблеми, порушені в коментарях
Опублікування складного об’єкта
Скажімо, у вас є складний клас моделі перегляду як параметр вашого методу дії веб-api, як це
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
і ваша кінцева точка веб-api схожа
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
На момент написання цього документа ASP.NET MVC 6 - це остання стабільна версія, а в MVC6 обидва контролери Web api та контролери MVC успадковують від Microsoft.AspNet.Mvc.Controller
базового класу.
Щоб надіслати дані методу з боку клієнта, наведений нижче код повинен добре працювати
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
Прив'язка моделі працює для деяких властивостей, але не для всіх! Чому?
Якщо ви не прикрасите параметр методу web api [FromBody]
атрибутом
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
І надішліть модель (необроблений об'єкт JavaScript, не у форматі JSON), не вказуючи значення властивості contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
Прив’язка моделі буде працювати для плоских властивостей моделі, а не для властивостей, де тип є складним / іншого типу. У нашому випадку Id
і Name
властивості будуть правильно прив'язані до параметра m
, Але Tags
властивість буде порожнім списком.
Ця ж проблема виникне, якщо ви використовуєте коротку версію, $.post
яка використовуватиме типовий вміст за замовчуванням під час надсилання запиту.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});