处理发布到 Web API 控制器的多个同名参数

Posted

技术标签:

【中文标题】处理发布到 Web API 控制器的多个同名参数【英文标题】:Handling multiple parameters with same name posted to Web API Controller 【发布时间】:2019-03-24 10:11:28 【问题描述】:

我有一个包含 <select multiple> 元素的 html 表单。即用户可以从列表中选择多个选项。我正在使用 jQuery 序列化表单数据并将其发布到 Web API 控制器(ASP.NET MVC)。

问题是,序列化导致查询字符串包含多个同名参数。这是 jQuery:

$('#submit').click(function () 

    var filters = $('#form').serialize();

    $.getJSON("/Api/GetData?" + filters, function (data) 
        // Do something with data
    );

);

生成的 API 调用如下:

/Api/GetData?selection=1234&selection=7432&selection=23

API 控制器似乎只接受“选择”参数的第一个值。它正在做这样的事情:

public void GetData(string selection)
    …

我想知道,有没有办法让 API 控制器将参数视为一个集合,或者应该在客户端处理,即通过确保参数值作为逗号分隔列表发送 (/Api/GetData?selection=1234,7432,23 )。如果是后者,是否有一种巧妙的方法来做到这一点,而不是手动构建查询字符串?

非常感谢。

【问题讨论】:

string selection -> string[] selection 您可以使用数组并将所有需要的值推送到数组中,然后在jquery中使用POST调用。 你的网址应该是这样的:Including Arrays in URI Requests @Reniuz 用于 php。它不适用于 MVC/WebAPI @RoryMcCrossan 是的...我在考虑错误的 url 并试图指出格式...废话...这是星期五你知道 :) 【参考方案1】:

感谢 cmets,我发现更改控制器参数有效:

public void GetData([FromUri] string[] selection)

(似乎需要 [FromUri] 装饰器)

【讨论】:

啊,是的,我错过了您正在发出 GET 请求。很高兴你成功了。

以上是关于处理发布到 Web API 控制器的多个同名参数的主要内容,如果未能解决你的问题,请参考以下文章

将多个对象从Angular控制器POST到Web API 2

将多个参数传递给 Web API GET 方法

多个同名查询参数

发送具有多个同名参数的 HTTP 请求

Web API 中的异步等待控制流

使用带有动态参数的 Kubernetes Ingress 到 Web API