2013-06-10 26 views
14

Mam funkcję podobną strukturę do tego:Przechodząc listę int do HttpGet życzenie

[HttpGet] 
public HttpResponseMessage GetValuesForList(List<int> listOfIds) 
{ 
    /* create model */   

    foreach(var id in listOfIds) 
     model.Add(GetValueForId(id) 

    /* create response for model */ 
    return response; 
} 

Jednak, kiedy robić żądania GET dla metody:

{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2 

otrzymuję błąd podczas debugowania stwierdzający, że listOfIds ma wartość null. W naszym kontrolerze mamy wiele publicznych metod HttpGet, które działają dobrze, a po zmianie parametru na pojedynczy int działa. Próbowałem zmienić typ parametru na int[] i IEnumerable<int>, ale bez zmian.

Jednak, po zmianie wywołania na HttpPost i przekazaniu listy jako wartości x-www-form-urlencoded, metoda działa.

Czy można przekazać listę do metody Get, czy też będę musiał użyć Posta? Ponieważ w rzeczywistości nie jest to metoda post (zwraca model wartości JSON i nic nie jest zapisywane na serwerze).

+1

Spójrz na [tę odpowiedź] (http://stackoverflow.com/a/2776855/706456). Bit wysyłania wygląda poprawnie, bity do czytania wymagają pewnych ulepszeń. I [jeszcze jeden] (http://stackoverflow.com/a/2301142/706456), gdzie wszystko wydaje się być proste. – oleksii

+0

Próbowałem już podanego drugiego linku bez powodzenia, ale pierwszy doprowadził mnie do metody będącej połączeniem tego adresu URL z odpowiedzią @ C.B., Którą dodałem poniżej. Dzięki – StormPooper

Odpowiedz

23

Jeśli używasz MVC WebAPI, następnie można zadeklarować metodę tak:

[HttpGet] 
public int GetTotalItemsInArray([FromUri]int[] listOfIds) 
{ 
     return listOfIds.Length; 
} 

a następnie kwerendy tak: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

ten będzie pasował tablica [1, 2, 3 ] do listy Parametry (i zwrot 3 zgodnie z oczekiwaniami)

+0

Dziękuję, widziałem już FromUri, ale nigdy nie pomyślałem, aby spróbować. Zmieniono zaakceptowaną odpowiedź na tę. – StormPooper

+0

link wydaje się być uszkodzony, byłoby świetnie mieć podstawowy kod klienta w tym przykładzie. – Jon

+0

@Jest to fałszywy link (blabla.com) .. Podałem tylko przykład tego, jak URL będzie wyglądał w kliencie. nie ma określonego kodu .. można go używać z jQuery, znacznikiem zakotwiczenia lub zwykłym javascript. –

3

Oto krótki kilof, aż do znalezienia lepszego rozwiązania:

  • korzystanie
  • następnie "listOfIds = 1,2,5,8,21,34?":
GetValuesForList(string listOfIds) 
{ 
    /* [create model] here */ 
    //string[] numbers = listOfIds.Split(','); 
    foreach(string number in listOfIds.Split(',')) 
     model.Add(GetValueForId(int.Parse(number)) 
    /* [create response for model] here */ 
    ... 
+0

Tak, mam nadzieję uniknąć ręcznej zamiany list, ale jeśli nikt inny nie ma trafniejszej odpowiedzi, wolałbym to zrobić, niż zrobić metodę POST. Dzięki – StormPooper

0

Do tej pory mam kombinację komentarza przez @oleksii i odpowiedź z @CB, ale przy użyciu TryParse radzę sobie z błędami i zerowym sprawdzeniem, aby uczynić go parametrem opcjonalnym.

var paramValues = HttpContext.Current.Request.Params.GetValues("listOfIds"); 
if (paramValues != null) 
{ 
    foreach (var id in paramValues) 
    { 
     int result; 
     if (Int32.TryParse(id, out result)) 
      model.Add(GetValueForId(Add(result)); 
     else 
      // error handling 
    } 
} 

Ponieważ wartości te nie są przekazywane z formularza musiałem zmienić @oleksii odpowiedź związanych z here używać Params zamiast Forms i połączeniu z sugestią, że od @ C.B. parsować wartości ciągu do int.

Chociaż pozwala to na tradycyjne listOfIds=1&listOfIds=2, nadal wymaga konwersji łańcuchów na ints.

+0

Ustawiłem to na moją akceptowaną odpowiedź, ale jeśli ktoś ma na to lepszy sposób, opublikuj to i zaznaczę twoją jako zatwierdzoną odpowiedź. – StormPooper

+0

Proszę zobaczyć odpowiedź od @ liran-brimer dla lepszego rozwiązania. – StormPooper

-1

Możesz również przekazać spersonalizowaną tablicę w łańcuchu żądań na kliencie i deserializować po stronie serwera:

var listOfIds = [1,2,3,45]; 
var ArrlistOfIds = JSON.stringify(listOfIds); 

Dla ciągu zapytania:

"MyMethod?listOfIds=" + ArrlistOfIds 

I wtedy po stronie serwera, po prostu deserializowania:

public ActionResult MyMethod(string listOfIds = null) 
{ 
    List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList(); 
    ....... 
} 

Teraz masz listę identyfikatorów, które mogą być analizowane na int.Int32.TryParse(id, out result)