2012-05-18 34 views
17

Tôi cảm thấy một chút ngớ ngẩn hỏi điều này nhưng tôi không thể tìm thấy một cách để có được các thông số cho một yêu cầu nhận được tại /api/foo?sort=name ví dụ.Làm thế nào để có được các tham số GET với ASP.NET MVC ApiController

Trong lớp ApiController, tôi đã cung cấp public string Get(). Đặt Get(string sort) làm cho /api/foo yêu cầu không hợp lệ. Yêu cầu phiên bản trong số ApiController là loại System.Net.Http.HttpRequestMessage. Nó không có thuộc tính QueryString hoặc Parameters hoặc bất kỳ thứ gì.

+0

Đây có phải là nhận/id của bạn hoặc bạn đang cố gắng để làm cho bạn nhận được? Đối với một get mà không có id trả về một IQueryable. Bạn sẽ cần cả GET() và GET (id) nếu bạn muốn hỗ trợ đầy đủ REST. – Maess

+0

Rất tiếc, nên đã chỉ định. Tôi đang cố gắng tạo một API để trả về một json có nội dung bị ảnh hưởng bởi tham số get? Tôi không hiển thị trực tiếp nguồn dữ liệu trực tiếp qua API – xster

+0

Nếu bạn cần đánh giá nhiều hơn id thì bạn sẽ cần phải truy cập IQueryable và sử dụng Odata. – Maess

Trả lời

12

Bạn chỉ có thể sử dụng

HttpContext.Current.Request.QueryString 
+5

điều này không hoạt động trong ngữ cảnh của ApiController trong mvc3 – BraveNewMath

0

Bạn đang cố gắng xây dựng một dịch vụ web OData? Nếu vậy, chỉ cần trả về một IQueryable, và Web API sẽ làm phần còn lại.

20

Các ApiController được thiết kế để làm việc mà không có đối tượng HttpContext (làm cho nó di động, và cho phép nó được lưu trữ bên ngoài của IIS).

Bạn vẫn có thể truy cập vào các thông số chuỗi truy vấn, nhưng nó được thực hiện thông qua các tài sản sau đây:

Request.GetQueryNameValuePairs() 

Dưới đây là một break loop example qua tất cả các giá trị:

foreach (var parameter in Request.GetQueryNameValuePairs()) 
{ 
    var key = parameter.Key; 
    var value = parameter.Value; 
} 
+3

GetQueryNameValueParirs() không có sẵn trên đối tượng Yêu cầu. Nó hoạt động sau khi "using System.Net.Http;" –

6

Dưới đây là một ví dụ mà được q chuỗi truy vấn từ yêu cầu và sử dụng nó để truy vấn tài khoản:

 var q = Request.GetQueryNameValuePairs().Where(nv => nv.Key =="q").Select(nv => nv.Value).FirstOrDefault(); 
     if (q != null && q != string.Empty) 
     { 
      var result = accounts.Where(a=>a.Name.ToLower().StartsWith(q.ToLower())); 
      return result; 
     } 
     else 
     { 
      throw new Exception("Please specify a search query"); 
     } 

Thị s có thể được gọi sau đó như thế này:

url/api/Accounts q = p

+0

Hoặc thậm chí tốt hơn: var q = Request.GetQueryNameValuePairs(). SingleOrDefault (nv => nv.Key == "q"); –

1

Nhận tất cả các cặp tên/giá trị chuỗi truy vấn vào một biến:

IEnumerable<KeyValuePair<string, string>> queryString = request.GetQueryNameValuePairs(); 

Sau đó giải nén querystring định

string value = queryString.Where(nv => nv.Key =="parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault(); 
0

Bạn cũng có thể sử dụng sau đây

var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value; 
+0

Điều này có thể không hoạt động như dự định khi giá trị mặc định được trả lại cho một KeyValuePair khi sử dụng ngay .Giá trị trên đó. –

+0

@LarsCelie nó hoạt động, nó làm việc cho tôi ít nhất :) – Khateeb321

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