2013-06-10 23 views
14

Tôi có một chức năng tương tự trong cấu trúc này:Đi qua một danh sách các int đến một HttpGet yêu cầu

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

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

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

Tuy nhiên, khi tôi làm một yêu cầu GET cho phương pháp:

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

tôi nhận được một lỗi khi gỡ lỗi ghi rằng listOfIds là null. Trong bộ điều khiển của chúng ta, chúng ta có một số phương thức HttpGet công cộng hoạt động tốt, và khi thay đổi tham số thành một int duy nhất nó hoạt động. Tôi đã thử thay đổi loại tham số thành int[]IEnumerable<int> cũng vậy, nhưng không thay đổi.

Tuy nhiên, khi thay đổi cuộc gọi thành HttpPost và chuyển danh sách dưới dạng giá trị x-www-form-urlencoded, phương thức hoạt động.

Có thể chuyển danh sách sang phương thức Nhận hoặc tôi có phải sử dụng Đăng không? Vì nó không thực sự là một phương thức bài (vì nó trả về một mô hình JSON các giá trị và không có gì được lưu vào máy chủ).

+1

Hãy xem [câu trả lời này] (http://stackoverflow.com/a/2776855/706456). Bit gửi có vẻ chính xác, bit đọc cần một số chỉnh sửa. Và [một số khác] (http://stackoverflow.com/a/2301142/706456) nơi mọi thứ có vẻ đơn giản. – oleksii

+0

Tôi đã thử liên kết thứ hai mà bạn cung cấp mà không có may mắn, nhưng liên kết đầu tiên dẫn tôi đến một phương pháp kết hợp URL đó và câu trả lời của @ C.B., Mà tôi đã thêm bên dưới. Cảm ơn – StormPooper

Trả lời

23

Nếu bạn đang sử dụng MVC WebAPI, sau đó bạn có thể khai báo phương pháp của bạn như thế này:

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

và sau đó bạn truy vấn như thế này: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

này sẽ phù hợp với mảng [1, 2, 3 ] vào tham số listOfIds (và trả lại 3 như mong đợi)

+0

Cảm ơn bạn, tôi đã thấy FromUri trước đây, nhưng chưa bao giờ nghĩ thử nó. Đã thay đổi câu trả lời được chấp nhận cho câu trả lời này. – StormPooper

+0

liên kết dường như bị hỏng, sẽ là tuyệt vời để có mã khách hàng cơ bản trong ví dụ là tốt. – Jon

+0

@Jon liên kết giả mạo của nó (blabla.com) .. tôi vừa đưa ra ví dụ về cách URL sẽ hiển thị trong ứng dụng khách. không có mã cụ thể .. bạn có thể sử dụng nó với jQuery, thẻ neo hoặc javascript đơn giản. –

3

Dưới đây là một cách nhanh chóng Hack cho đến khi bạn tìm thấy một giải pháp tốt hơn:

  • sử dụng
  • sau đó "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

Vâng, tôi hy vọng sẽ không thực hiện bất kỳ chuyển đổi danh sách thủ công nào, nhưng nếu không ai khác có câu trả lời cho câu trả lời tôi muốn làm điều này hơn là làm cho nó trở thành phương thức POST. Cảm ơn – StormPooper

0

Cho đến nay tôi có một sự kết hợp của các bình luận của @oleksii và câu trả lời từ @CB, nhưng sử dụng TryParse để đối phó với các lỗi và một kiểm tra null để làm cho nó một tham số tùy chọn.

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

Kể từ khi giá trị không được truyền từ một hình thức tôi đã phải thay đổi @oleksii câu trả lời liên quan đến từ here sử dụng Params thay vì Forms và kết hợp điều đó với những gợi ý từ @ C.B. để phân tích các giá trị chuỗi thành int.

Trong khi điều này cho phép listOfIds=1&listOfIds=2 truyền thống, nó vẫn yêu cầu chuyển đổi chuỗi thành int.

+0

Tôi đã đặt câu trả lời này thành câu trả lời được chấp nhận của tôi, nhưng nếu có ai có cách làm việc này, vui lòng đăng và tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời được chấp thuận. – StormPooper

+0

Vui lòng xem câu trả lời từ @ liran-brimer để có giải pháp tốt hơn. – StormPooper

-1

Bạn cũng có thể chuyển mảng được tuần tự hóa vào chuỗi yêu cầu trên máy khách và deserialize ở phía máy chủ:

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

Đối với chuỗi truy vấn:

"MyMethod?listOfIds=" + ArrlistOfIds 

Và sau đó ở phía máy chủ, chỉ deserialize:

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

Bây giờ bạn có một danh sách các id mà có thể được phân tích để int.Int32.TryParse(id, out result)

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