2014-11-13 2 views
0

Я хочу передать коллекцию строк к API конечной точке:Не удается передать коллекцию строк в контроллер API

[HttpGet] 
public DashboardSectionViewModel GetDashboard(
    DateTime lowerBound, 
    DateTime upperBound, 
    [FromUri] List<string> excludedStores = null, 
    [FromUri] List<string> excludedItems = null) 
{ 
    //Code 
} 

Вот где я делаю вызов:

$.ajax({ 
    url: App.Services.updateUrl + src.updateUrl, 
    type: "GET", 
    data: { 
     lowerBound: self.slideFilter.lowerBoundDisplay(), 
     upperBound: self.slideFilter.upperBoundDisplay(), 
     excludedStores: self.storeFilter.excludedStores(), 
     excludedItems: self.experienceFilter.excludedItems() 
    } 
}); 

Это прекрасно работает, когда два элемента коллекции не являются параметрами и не передаются по запросу AJAX. Это не сработало, когда я изначально использовал IEnumerable<string>, и изменение на List<string> тоже не сработало. Нужно ли настраивать маршрут для этого? Получит ли переводчик DateTime, но не IEnumerable<T>?

EDIT: Вот это URL генерируется с пустыми коллекциями прошли:

(заголовок)/API/ContentAPI/GetDashboard LowerBound = 10-12 & UpperBound = 10-23

Вот URL-адрес генерируется с некоторыми пунктами сбора прошел:

(заголовок)/API/ContentAPI/GetDashboard LowerBound = 10-10 = & UpperBound 10-23 & excludedStores% 5B% 5D = привет & excludedStores% 5B% 5D = мир & excludedExperiences% 5B% 5D = привет & excludedExperiences% 5B% 5D = мир

Я думаю, что это проблема сериализации, но Я не уверен.

+0

Пробовал приклеивать параметры к классу и иметь только один объект в качестве параметра для вашего метода API? –

+0

Я не думал, что это сработает, потому что оно не правильно интерпретирует коллекции. После тестирования он также не интерпретирует объект. – jokulmorder

+0

Вместо передачи списка строк попробуйте передать значение в виде строки и использовать токенизатор внутри метода, чтобы разбить строку на перечислимую строку. –

ответ

1

Для того, чтобы веб-апи связываться с вашим действием параметры Ваш запрос должен выглядеть следующим образом:

?lowerBound=10-12&upperBound=10-20&excludedStores=hello&excludedStores=world&excludedItems=hello&excludedItems=world 

Это связывается с параметрами вашего действия:

public DashboardSectionViewModel Get(DateTime lowerBound, DateTime upperBound, [FromUri]List<string> excludedStores = null, [FromUri]List<string> excludedItems = null) 

Чтобы создать запрос вам придется вызывать $.param(), а затем заменять кодированные URL []. Например:

var query = $.param({ 
    lowerBound: '10-12', 
    upperBound: '10-20', 
    excludedStores: ['hello', 'world'], 
    excludedItems: ['hello', 'world'] 
}).replace(/%5B%5D/g, '') 

$.ajax({ 
    url: App.Services.updateUrl + src.updateUrl + '?' + query, 
    type: "GET" 
}); 
Смежные вопросы