Mam kontroler ASP.net MVC o nazwie, Designs
który ma akcję z następującym podpisem:
public ActionResult Multiple(int[] ids)
Jednak gdy próbuję przejść do tej akcji za pomocą adresu URL:
http://localhost:54119/Designs/Multiple?ids=24041,24117
ids
Parametr jest zawsze zerowa. Czy istnieje sposób, aby MVC przekonwertował ?ids=
parametr zapytania adresu URL na tablicę dla akcji? Widziałem rozmowy o używaniu filtru akcji, ale o ile wiem, będzie to działać tylko w przypadku POST, w których tablica jest przekazywana w danych żądania, a nie w samym adresie URL.
źródło
[FromUri]
.public ActionResult Multiple([FromUri]int[] ids) {}
(GET)Aby rozszerzyć odpowiedź Darina Dimitrova , coś, co może ujść na sucho, to zaakceptowanie prostego
string
parametru w adresie URL i samodzielne przekonwertowanie go na tablicę:public ActionResult Multiple(string ids){ int[] idsArray = ids.Split(',').Select(int.Parse).ToArray(); /* ...process results... */ }
Jeśli podczas wykonywania tej czynności wystąpi błąd analizy (ponieważ ktoś przekazał Ci zniekształconą tablicę), możesz spowodować, że program obsługi wyjątków zwróci
400 Bad Request
błąd zamiast domyślnego, bardziej nieprzyjaznego404 Not Found
błędu, który MVC zwraca, gdy punkt końcowy nie zostanie znaleziony.źródło
Możesz również użyć tego formatu adresu URL, a ASP.NET MVC zrobi wszystko za Ciebie. Pamiętaj jednak, aby zastosować kodowanie adresów URL.
?param1[0]=3344¶m1[1]=2222
źródło
Nie wiem, skąd pochodzi ciąg adresu URL Groky, ale miałem ten sam problem z jakimś javascriptem wywołującym mój kontroler / akcję. Utworzyłoby to adres URL
null
, 1 lub wiele „identyfikatorów” z listy wielokrotnego wyboru (która jest unikalna dla rozwiązania, które zamierzam udostępnić).Skopiowałem / wkleiłem spoiwo modelu Darina i ozdobiłem moje działanie / parametr, ale to nie zadziałało. Nadal jestem
null
cenionyint[] ids
. Nawet w „bezpiecznym” przypadku, w którym faktycznie miałem wiele dokumentów.Skończyło się na zmianie javascript, aby utworzyć przyjazną tablicę parametrów ASP.NET MVC, taką jak
?ids=1&ids=2
Musiałem jednak zrobić trochę głupich rzeczy
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
A więc cały blok był
ids = [].concat.apply([], [ids || []]) id_parameter = 'ids=' + ids.join('&ids=')
To niechlujne, ale po raz pierwszy musiałem tak hakować w javascript.
źródło
Odpowiedź .Net Core
Dla tych, którzy przyjeżdżają tu ostatnio, możesz to zrobić w .Net Core za pomocą:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
i:
public ActionResult Multiple([FromQuery] int[] ids) { ... }
źródło