2012-03-30 38 views
7

Hãy nói tôi có hai phương pháp trong MVC điều khiển API 4 Web:Thông số URL trong MVC 4 Web API

public IQueryable<A> Get() {} 

public A Get(int id) {} 

Và con đường sau:

routes.MapHttpRoute(
    name: "Default", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Điều này hoạt động như mong đợi. Thêm một thêm một tham số, ví dụ:

public IQueryable<A> Get(int p) {} 

public A Get(int id, int p) {} 

dẫn đến tình trạng khi MVC trả 404 cho các yêu cầu sau:

GET /controller?p=100 

Hoặc

GET /controller/1?p=100 

với thông điệp "Không có hành động đã được tìm thấy trên bộ điều khiển 'bộ điều khiển' phù hợp với yêu cầu "

Tôi hy vọng rằng sự ngang bằng URL ters nên được dây bởi MVC mà không có vấn đề, nhưng nó không phải là sự thật. Đây có phải là lỗi hoặc sự hiểu lầm của tôi về cách bản đồ MVC yêu cầu hành động không?

+0

[Đây] (http: // diễn đàn. asp.net/t/1774984.aspx/2/10) cùng một vấn đề được mô tả nhưng không có kết luận là hành vi này dự kiến ​​ –

+0

PS. do cùng một cú pháp OData trong URL sẽ không hoạt động nếu có nhiều hơn một phương thức được ánh xạ tới Động từ HTTP. –

+0

Bạn có thể hiển thị tuyến đường thực tế của bạn và tất cả các phương pháp và chữ ký trong bộ điều khiển của bạn không? –

Trả lời

8

Nếu bạn nghĩ về những gì bạn đang cố gắng thực hiện và các tuyến bạn đang thử, bạn sẽ nhận ra tham số thứ hai "p" trong trường hợp của bạn, cũng cần được đánh dấu là tham số tùy chọn.

đó là tuyến đường của bạn cần được xác định như sau:

routes.MapHttpRoute(
name: "Default", 
routeTemplate: "{controller}/{id}/{p}", 
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional }); 

Khi bạn làm điều này, URL

/điều khiển p = 100 sẽ bản đồ để bạn

public IQueryable<A> Get(int p) {} 

? phương pháp và URL giống như vậy:

/controller/1?p=100 

sẽ ánh xạ tới phương thức

public A Get(int id, int p) {} 

, như bạn mong đợi.

Vì vậy, để trả lời câu hỏi của bạn .... không có lỗi này không phải là lỗi nhưng được thiết kế/mong đợi.

+0

Điều này là OK, nhưng theo như tôi nhớ khi một thời gian trước đây được sử dụng MVC 2, cách phổ biến là chỉ để xác định các thông số phương pháp, mà không cần chạm vào tuyến đường. Ví dụ: [ở đây] (http://stackoverflow.com/questions/627838/asp-net-mvc-getting-querystring-values) - và MVC nên thực hiện công việc cho phần Truy vấn hệ thống dây dẫn của URL để nhập các tham số. –

+0

@pborovik, Như tôi đã nói, trước đó, "nếu bạn nghĩ về nó", bạn sẽ nhận ra rằng bạn cần phải xác định rằng tham số thứ hai là tùy chọn là tốt. Bạn không thể nói tham số đầu tiên là tùy chọn nhưng tham số thứ hai thì không. Nó chỉ không có ý nghĩa. –

+0

@pborovik nếu bạn định nghĩa "quá tải" cho các phương thức này, thì trình điều khiển API sẽ gửi đến các phương thức đó trong trường hợp tham số thứ hai không được cung cấp. Nhưng trong trường hợp của bạn, bạn chỉ có hai phương pháp, do đó người điều phối không thể gửi đến bất kỳ phương thức hành động nào. –

0

Trong WebApiConfig thêm giá trị mặc định mới cho httproute

RouteParameter.Optional cho các tuyến đường bổ sung đã không làm việc cho tôi

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}/{voucher}", 
      defaults: new { id = RouteParameter.Optional ,defaultroute1="",defaultroute2=""} 
     ); 
Các vấn đề liên quan