РЕДАКТИРОВАТЬ : 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);
});