2013-03-18 41 views
6

Tôi đang gửi dữ liệu từ biểu mẫu cửa sổ đến dịch vụ web dưới dạng ArrayList. Trong tuyên bố dịch vụ web của phương pháp của tôi cũng giống như:Phương pháp có một số đối số không hợp lệ?

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

} 

và ở dạng cửa sổ, vào nút bấm, mã của tôi là:

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 lựa chọn là ArrayList và dịch vụ web Tôi cũng đang sử dụng loại biến số ArrayList để giữ giá trị này, vậy tại sao lỗi này lại xảy ra?

  2. Đây có phải là cách thích hợp để gửi thông số tới dịch vụ web hay không có cách nào khác cho việc này?

+0

Trong tùy chọn ArrayList mã của bạn; nên giống như ArrayList options = new ArrayList(); – Satpal

Trả lời

8

Dịch vụ web không thể chuyển các loại phức tạp như ArrayList hoặc ít nhất là không có cấu hình, vì vậy đơn giản hóa dịch vụ web của bạn. Thay đổi nó như thế này:

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

đó là cách nó được tạo ra anyway như bạn có thể nhìn thấy, và sau đó gọi nó như thế này:

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); 
} 

Một lựa chọn khác cho việc khởi tạo options , nếu bạn đang tìm kiếm một cái gì đó ngắn gọn hơn, sẽ như sau:

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

Cấu hình _Very simple_: bằng cách vào trang cấu hình và chọn loại danh sách chung có nghĩa là một thế giới của niềm vui so với 'làm chậm' như thế này. –

+1

@GrantThomas, đúng như vậy, có vẻ như thực tế hơn là tận dụng các kiểu nguyên thủy để các nền tảng khác có khả năng truy cập vào các dịch vụ của bạn nhiều hơn? Tôi đoán tôi nghĩ theo cách này bởi vì trong tổ chức của tôi, chúng tôi có MF, Java, .NET, C++, PHP, Perl và bất kỳ nền tảng nào khác mà bạn có thể nghĩ đến hoạt động trên các phần tổ chức. –

+0

Bạn không phải là người duy nhất 'nghĩ theo cách này', nhưng bạn hiểu lầm tôi. Cấu hình như vậy không ngăn các máy khách không phải .NET một chút: đó là một cấu hình _client_. Một trường hợp mà một chút kiến ​​thức hợp chất ý tưởng và tiến bộ. –

0

Tôi sẽ sử dụng danh sách hoặc mảng được nhập trong định nghĩa phương thức web của bạn. Không thể nhầm lẫn. Danh sách mảng không được nhập mạnh, có nghĩa là nội dung không thể được biết đến cho đến khi chạy.

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

} 
4

tôi sẽ đề nghị bạn sử dụng

[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); 
} 

Chỉnh sửa # 1

Vâng nói Michael:

dịch vụ Web không thể vượt qua các loại phức tạp như ArrayList, hoặc ít nhất là không nếu không có cấu hình, vì vậy chỉ cần đơn giản hóa dịch vụ web của bạn. - Michael

Chỉnh sửa # 2

Để sử dụng dịch vụ web của bạn System.Collections.Generic.List

  1. Nhấp chuột phải vào dịch vụ trong Dịch vụ Tài liệu tham khảo
  2. Dịch vụ Configure Reference
  3. trong Data Type nhóm
  4. Thay đổi loại Bộ sưu tập thành System.Collections.Generic.List
2

Hãy quên tất cả điều này làm thay đổi mã vô nghĩa của bạn.

Nếu bạn bấm chuột phải vào dịch vụ trong thư mục "Tham khảo dịch vụ" và chọn "Định cấu hình tham chiếu dịch vụ" từ trình đơn ngữ cảnh, bạn có thể chỉ định loại máy khách sẽ sử dụng cho bộ sưu tập.

Trong trường hợp của bạn, chỉ cần chọn System.Collections.ArrayList từ menu thả xuống "Loại bộ sưu tập".

Tuy nhiên, bạn có thể chỉ định System.Collections.Generic.List và có danh sách chung chung được nhập mạnh mẽ.

+0

:) Không nhận thấy ai đó đã đăng bài này; kết nối chậm :( – Tebo

Các vấn đề liên quan