Отправка массивов и сложных данных

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 29.10.2015

Благодаря использованию привязчиков мы можем отправлять контроллеру 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

Подобным образом мы можем отправлять объекты 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]=Тургенев
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850