Odebranie tablicy liczb z żądania HTTP

Odebranie tablicy liczb z żądania HTTP
JD
  • Rejestracja:około 19 lat
  • Ostatnio:około 21 godzin
0

taki kod działa poprawnie, binduje poprawnie

Kopiuj
[HttpGet("get")]
public ActionResult<IEnumerable<Customer>> customers([FromQuery(Name = "id[]")] IEnumerable<int> id)
{
    //taki leci get z frontu http://api/customer/get?id[]=388&id[]=211&id[]=189&id[]=252&id[]=359&id[]=153&id[]=270
}

natomiast

Kopiuj
public ActionResult<IEnumerable<Order>> GetAll([FromQuery] SalesRepresentativeDateRangeRequest request) {}
    public class SalesRepresentativeDateRangeRequest
    {
        public IEnumerable<int> SalesRepresentativeId { get; set; }
        public DateTime Start { get; set; }
        public DateTime End { get; set; }

    }
// taki leci get z frontu http://api/order/all?SalesRepresentativeId[]=388&SalesRepresentativeId[]=211&SalesRepresentativeId[]=189&SalesRepresentativeId[]=252&SalesRepresentativeId[]=359&SalesRepresentativeId[]=153&SalesRepresentativeId[]=270&Start=2023-03-01&End=2023-03-31    

SalesRepresentativeId w ogóle nie jest zbindowany
jak poprawnie zbindować

edytowany 1x, ostatnio: Riddle
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:mniej niż minuta
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
0

A nie lepiej zrobić to jako HttpPost i w body przekazać cały obiekt? Za chwilę przekroczysz limit url ✌️

JD
konwencyjnie dane pobieramy GETem
AdamWox
Zmieniłbym nazewnictwo endpointów. Nie rób get jeśli to jest jedyny get w tym kontrolerze. Zmień na [HttpPost("customers")] i zrób parametr [FromBody] i nie przejmuj się "konwencjami" o ile korpo ci na to pozwala.
G1
Konwencje nie przy wszystkich przypadkach się sprawdzają. Ostatnio musiałem sporo kodu przerobić. Zapytaniem GET pobierałem dane do wykresów dla wybranych maszyn. Przekazywałem właśnie identyfikatory. Jak aplikacja sie rozrosła i trzeba było pobrać dane to przekroczyłem limit ciągu ;D
AdamWox
@gswidwa1: Dokładnie, konwencje gubią. Jak coś jest głupie, a działa to nie jest głupie ✌️
SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:4 minuty
  • Postów:1520
0

Według dokumentacji powinno się podawać parametr tablicowy w inny sposób
https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-6.0

W twoim przypadku bez []
SalesRepresentativeId=359&SalesRepresentativeId=153&SalesRepresentativeId

btw. Pierwszy przykład działa bo podałeś nazwe from query id[] i takie coś id[] znalazł w urlu

edytowany 1x, ostatnio: szydlak
JD
axios dodaje [] do parametrów w query string, faktycznie jak usunę z ręki działa ładnie. muszę doczytać jak pozbyć się z frontu [] podczas wysyłania requestu
SZ
Może zadziała ustawienie bindowania na property w modelu podobnie jak masz w działającym przykładzie. Jako name podasz SalesRepresentativeId[]
JD
[BindProperty(Name = "SalesRepresentativeId[]")] - zadziałało
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

Z zasady deserializery w Javie / C# nie lubią się z tablicami, a głównym powodem jest brak bezargumentowego konstruktora (a dobre zostawiają w logach wiadomość w tej sprawie, w tym dla symetrii odmawiają w serializerze też)
Wprawdzie rozmiar tablicy to "trochę inny" argument konstruktora niz dla zwykłego obiektu, ale fakt jest faktem.

List - dlatego że da się skonstruować bezargumentowo, w praktyce na nieznaną długość, a taka sytuacja jest przed deserializacją


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 2x, ostatnio: ZrobieDobrze
G1
Nigdy nie miałem problemu z deserializacją tablic od kiedy korzystam z Newtonsoft.Json

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.