Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Благодаря использованию привязчиков мы можем отправлять контроллеру Web Api не только простые значения, но и более сложные данные, например, коллекции объектов.
Передача массивов производится также, так и простых объектов. Например, в представлении мы отправляем массив:
var books = [{ name: "Чайка", price: 200, }, { name: "Война и мир", price: 230, }]; $.ajax({ url: '/api/values/', type: 'POST', data: JSON.stringify(books), contentType: "application/json;charset=utf-8", success: function (data) { alert('Данные отправлены'); } });
Получение в методе контроллера будет выглядеть так:
public void Post(Book[] books) { // обработка массива }
Поскольку Web Api имеет встроенного привязчика для коллекций, то вместо массива мы могли бы использовать и список:
public void Post(List<Book> books) { // обработка массива }
Клиентский код на javascript от этого бы не изменился.
Данные могут включать объекты других классов. Например, каждая книга содержит ссылку на автора:
public class Book { public int Id { get; set; } public string Name { get; set; } public int Price { get; set; } public Author Author { get; set; } } public class Author { public string Name { get; set; } public int Year { get; set; } }
Отправка данных в javascript:
var books = [{ name: "Чайка", price: 200, author: { name: "Чехов", year: 1860 } }, { name: "Война и мир", price: 230, author: { name: "Толстой", year: 1828 } }]; $.ajax({ url: '/api/values/', type: 'POST', data: JSON.stringify(books), contentType: "application/json;charset=utf-8", success: function (data) { alert('Данные отправлены'); } });
Метод контроллера не изменяется: public void Post(List<Book> books)
Мы также можем передавать простые массивы из строки запроса, используя атрибут ModelBinder. Например, у нас есть метод:
public string GetValue([ModelBinder]int[] nums) { return "val"; }
Он соответствует маршруту:
config.Routes.MapHttpRoute( name: "SomeRoute", routeTemplate: "api/{controller}/{action}" );
Тогда передать массив nums в метод мы можем с помощью, например, такой строки запроса: api/values/getvalue?nums=2&nums=3. После этого метод получит массив из двух чисел 2 и 3.
Подобным образом мы можем отправлять объекты Dictionary. Например, упростим модель Book:
public class Book { public string Name { get; set; } public string Author { get; set; } }
Чтобы получить словарь объектов в методе, данный словарь передается в качестве параметра с использованием атрибута ModelBinder:
[Route("api/values/setbooks")] public void GetValue([ModelBinder] Dictionary<string, Book> books) { // обработка словаря }
Тогда в представлении мы можем отправить словарь следующим образом:
function SendItems() { $.ajax({ url: '/api/values/setbooks', type: 'GET', data: { books: [{ key: "id12345667889", value: { name: "Война и мир", author: "Толстой" } },{ key: "id12345667467", value: { name: "Отцы и дети", author: "Тургенев" } }] }, success: function (data) { alert("Данные отправлены"); } }); }
В качестве ключей я выбрал произвольные строковые значения.
Более того мы можем отправить данные и через строку запроса. Например, вышеиспользованные данные отправляются такой строкой запроса:
localhost:17577/api/values/setbooks?books[0][key]=id123456&books[0][value][name]=Война и мир &books[0][value][author]=Толстой&books[1][key]=id24356536 &books[1][value][name]=Отцы и дети&books[1][value][author]=Тургенев