无法将字符串集合传递给API控制器

时间:2014-11-13 22:49:46

标签: .net asp.net-web-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>吗?

编辑:这是通过传递空集合生成的URL:

  

(标题)/ API / ContentApi / GetDashboard下界= 10-12安培; UPPERBOUND = 10-23

以下是通过传递的一些集合项生成的URL:

  

(标题)/ API / ContentApi / GetDashboard下界= 10-10&安培; UPPERBOUND = 10-23&安培; excludedStores%5B%5D =你好&安培; excludedStores%5B%5D =世界&安培; excludedExperiences%5B%5D =你好&安培; excludedExperiences %5B%5D =世界

我认为这是序列化问题,但我不确定。

1 个答案:

答案 0 :(得分:1)

为了使web api绑定到您的操作参数,您的查询应如下所示:

?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 encoded []字符。像这样:

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"
});