РЕДАКТИРОВАТЬ: 31.10.2017
Тот же код / подход будет работать и для Asp.Net Core 2.0. Основное различие заключается в том, что в ядре asp.net и контроллеры веб-API, и контроллеры Mvc объединены в модель с одним контроллером. Таким образом, ваш тип возврата может быть IActionResult
или одной из его реализаций (Пример: 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 и веб-контроллеры 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 :)
});
Привязка модели работает для некоторых свойств, но не для всех! Почему ?
Если вы не украшаете параметр метода веб-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
, которая будет использовать Content-Type по умолчанию при отправке запроса.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});
26.11.2013
DateTime?
не анализируются из строк «yyyy-MM-dd» в POST, но анализируются в GET с[FromUri]
, установленным для модели. 24.02.2016[JsonConverter(typeof (YourCustomConverter))]
- решение для таких полей. 24.02.2016Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
26.01.2017