2013-03-18 11 views
6

Wysyłam dane z formularza okna do serwisu internetowego w postaci ArrayList. W deklaracji serwis internetowy mojej metody jest tak:Metoda ma pewne nieprawidłowe argumenty?

[WebMethod] 
public int SaveSelectedOffers(ArrayList offers, int selectedRows) 
{ 

} 

w postaci okien, w przycisk kliknięcia, mój kod jest:

private void offersAvailableSubmit_Click(object sender, EventArgs e) 
{ 
    ArrayList options; 
    options.Add("item 1"); 
    options.Add("item 2"); 
    options.Add("item 2"); 
    //In this line of code it is showing error that Argument 1: cannot convert from 'System.Collections.ArrayList' to 'object[]' 
    int rowsAffected = serviceCaller.SaveSelectedOffers(options, rowCount); 
} 
  1. Datatype opcji jest ArrayList i usługi internetowej również używam zmiennej typu ArrayList do przechowywania tej wartości, a następnie dlaczego ten błąd występuje?

  2. Czy to właściwy sposób przesyłania parametrów do usługi sieciowej, czy jest na to inny sposób?

+0

W swoim kodzie opcje ArrayList; powinno być jak opcje ArrayList = new ArrayList(); – Satpal

Odpowiedz

8

usługi sieci Web nie może przechodzić złożone typy jak ArrayList, a przynajmniej nie bez pewnej konfiguracji, więc po prostu uprościć obsługę internetową. Zmień go na:

public int SaveSelectedOffers(object[] offers, int selectedRows) 

czyli jak to jest generowane w każdym razie, jak widać, a następnie nazwać tak:

private void offersAvailableSubmit_Click(object sender, EventArgs e) 
{ 
    object[] options = new object[3]; 
    options[0] = "item 1"; 
    options[1] = "item 2"; 
    options[2] = "item 2"; 

    int rowsAffected = serviceCaller.SaveSelectedOffers(options, rowCount); 
} 

Inną opcją dla inicjalizacji options , jeśli szukasz czegoś bardziej zwięzłego, będzie to:

object[] options = new object[] { "item 1", "item 2", "item 3" }; 
+2

_Bardzo prosta konfiguracja: wchodząc na stronę konfiguracji, wybór ogólnego rodzaju listy oznacza świat przyjemności w porównaniu do "dumbing down" w ten sposób. –

+1

@GrantThomas, czy to prawda, czy nie wydaje się bardziej praktyczne wykorzystanie typów pierwotnych, aby inne platformy były znacznie bardziej zdolne do uzyskania dostępu do twoich usług? Chyba tak myślę, ponieważ w mojej organizacji mamy MF, Java, .NET, C++, PHP, Perl i każdą inną platformę, którą możesz sobie wyobrazić, działając w sekcjach organizacyjnych. –

+0

Nie jesteś jedynym, który "myśli w ten sposób", ale źle mnie zrozumiałeś. Taka konfiguracja nie zapobiega jednemu bitowi klientów innych niż .NET: jest konfiguracją _client_. Przypadek, w którym odrobina wiedzy łączy idee i postęp. –

0

Chciałbym użyć wpisanej listy lub tablicy w definicji metody internetowej. Nie jest możliwe pomylenie. Lista tablic nie jest silnie wpisana, co oznacza, że ​​zawartość nie może być znana przed uruchomieniem.

[WebMethod] 
public int SaveSelectedOffers(string[] offers, int selectedRows) 
{ 

} 
4

Proponuję użyć

[WebMethod] 
public int SaveSelectedOffers(IList<string> offers, int selectedRows) 
{ 

} 

private void offersAvailableSubmit_Click(object sender, EventArgs e) 
{ 
    IList<string> options = new List<string>(); 
    options.Add("item 1"); 
    options.Add("item 2"); 
    options.Add("item 2"); 

    int rowsAffected = serviceCaller.SaveSelectedOffers(options, rowCount); 
} 

Edit # 1

Dobrze powiedziane przez Michael:

usługi sieci Web nie może przechodzić złożone typy jak ArrayList, a przynajmniej nie bez niektórych konfiguracja, więc po prostu uprość serwis internetowy. - Michael

Edit # 2

Aby dokonać korzystać z usługi internetowej System.Collections.Generic.List

  1. prawym przyciskiem myszy usługę w służbie Referencje
  2. Konfiguracja usługi Reference
  3. w grupie Typ danych
  4. Zmień typ kolekcji na System.Collections.Generic.List
2

Zapomnij o tym, zmieniając swój nonsens.

Po kliknięciu prawym przyciskiem myszy usługi w folderze "Referencje usługi" i wybraniu z menu kontekstowego opcji "Konfiguruj odniesienie do usługi" można określić, jakiego typu klient powinien używać do gromadzenia.

W twoim przypadku po prostu wybierz System.Collections.ArrayList z listy rozwijanej "Typ kolekcji".

Można jednak podać System.Collections.Generic.List i mieć silnie wpisane ogólne listy.

+0

:) Nie zauważyłem, że ktoś to opublikował; wolne połączenie :( – Tebo

Powiązane problemy