2012-12-15 10 views
7

Tôi có một điều khiển web api (TasksController) với một phương pháp get như:Tham số tùy chọn WebApi - là bắt buộc?

public IEnumerable<TimeUnitModel> Get(DateTime startDate, DateTime endDate, string projectCode = "") 

Nếu tôi gọi

/api/tasks?startDate=2012%2F12%2F08&endDate=2012%2F12%2F15 

kết quả chính xác được trả về.

Nếu tôi gọi

/api/tasks?startDate=2012%2F12%2F08&endDate=2012%2F12%2F15&projectCode= 

sau đó tôi nhận được:

{"projectCode.String":"A value is required but was not present in the request."} 

Bất cứ ý tưởng tại sao điều này xảy ra? Cảm ơn.

Edit: Đây là những gì tôi có trong lộ trình cấu hình:

config.Routes.MapHttpRoute(
      name: "tasks_get", 
      routeTemplate: "api/tasks", 
      defaults: new { controller = "tasks", projectCode = RouteParameter.Optional} 
     ); 
+0

Bạn đã đặt UrlParameter.Optional trong RouteConfig của bạn cho tham số projectCode chưa? – dinukadev

+0

Tôi đã thử cách này và không thể thấy những gì bạn thấy. Tôi thậm chí loại bỏ mặc định từ hành động và tất cả các công trình không có vấn đề. – Aliostad

+1

@sirrocco Tôi đã thấy hành vi tương tự như vậy trước đây, về câu hỏi này http://stackoverflow.com/questions/12006524/why-does-modelstate-isvalid-fail-for-my-apicontroller-method-that-has-nullable -p/12622152 # 12622152 –

Trả lời

2

cuộc gọi đầu tiên của bạn: /api/tasks?startDate=2012%2F12%2F08&endDate=2012%2F12%2F15 cách bạn gọi phương thức với tham số tùy chọn (tức là tham số là không bắt buộc , vì vậy bạn không chỉ định nó). Khi bạn chỉ định "& projectCode =" trong chuỗi truy vấn, bạn chỉ định tham số và bạn chỉ định tham số đó là null. Vì chuỗi là vô hiệu, api giả định bạn muốn để gửi giá trị null. Nếu bạn muốn phương thức chạy với một chuỗi rỗng, chỉ cần gọi nó theo cách bạn đã làm trước đó mà không cần gửi tham số đó chút nào.