Eu tenho um controlador ASP.net MVC chamado Designs
que tem uma ação com a seguinte assinatura:
public ActionResult Multiple(int[] ids)
No entanto, quando tento navegar para esta ação usando o url:
http://localhost:54119/Designs/Multiple?ids=24041,24117
O ids
parâmetro é sempre nulo. Existe alguma maneira de fazer o MVC converter o ?ids=
parâmetro de consulta de URL em um array para a ação? Já vi falar sobre o uso de um filtro de ação, mas pelo que posso dizer, isso só funcionará para POSTs em que o array é passado nos dados da solicitação, e não na própria URL.
fonte
[FromUri]
.public ActionResult Multiple([FromUri]int[] ids) {}
(GET)Para estender a resposta de Darin Dimitrov , algo que você pode fazer é aceitar um
string
parâmetro simples no seu URL e convertê-lo em um array você mesmo:public ActionResult Multiple(string ids){ int[] idsArray = ids.Split(',').Select(int.Parse).ToArray(); /* ...process results... */ }
Se você obtiver um erro de análise ao fazer isso (porque alguém lhe passou um array malformado), pode fazer com que seu manipulador de exceção retorne um
400 Bad Request
erro em vez do erro padrão, mais hostil404 Not Found
que o MVC retorna quando um ponto de extremidade não é encontrado.fonte
Você também pode usar este formato de URL, e a ASP.NET MVC fará tudo por você. Mas lembre-se de aplicar a codificação de URL.
?param1[0]=3344¶m1[1]=2222
fonte
Não sei de onde vinha a string de URL do Groky, mas tive o mesmo problema com algum javascript chamando meu controlador / ação. Ele criaria um URL de
null
1 ou muitos "IDs" de uma lista de seleção múltipla (que é exclusiva para a solução que irei compartilhar).Copiei / colei o fichário de modelo personalizado de Darin e decorei minha ação / parâmetro, mas não funcionou. Eu ainda fui
null
valorizadoint[] ids
. Mesmo no caso "seguro" em que eu realmente tinha muitos IDs.Acabei mudando o javascript para produzir um array de parâmetros amigável para ASP.NET MVC como
?ids=1&ids=2
Eu tive que fazer algumas coisas bobas, embora
ids || [] #=> if null, get an empty array [ids || []] #=> if a single item, wrap it in an array [].concat.apply([], ...) #=> in case I wrapped an array, flatten it
Então, todo o bloco foi
ids = [].concat.apply([], [ids || []]) id_parameter = 'ids=' + ids.join('&ids=')
É confuso, mas é a primeira vez que tenho que hackear assim em javascript.
fonte
.Net Core Answer
Para aqueles que vêm aqui recentemente, você pode fazer isso no .Net Core com:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
e:
public ActionResult Multiple([FromQuery] int[] ids) { ... }
fonte