2012-04-19 25 views
5

Tôi tò mò tại sao ApiController xử lý giá trị tham số mặc định trên các hành động khác với Bộ điều khiển 'thông thường'.Giá trị tham số mặc định trong MVC 4 Web API

Mã này chỉ hoạt động tốt, yêu cầu/Kiểm tra nghĩa trang được giá trị 1

public class TestController : Controller 
{ 
    public ActionResult Index(int page = 1) 
    { 
     return View(page); 
    } 
} 

Mã này không hoạt động khi một yêu cầu được thực hiện để/api/giá trị. Nó không thành công với:

"Từ điển thông số chứa mục nhập rỗng cho tham số 'trang' của loại không thể loại 'System.Int32' cho phương thức 'System.Collections.Generic.IEnumerable`1 [System.String] Get (Int32) 'in' MvcApplication1.Controllers.Controllers.ValuesController '. Một tham số tùy chọn phải là một kiểu tham chiếu, một kiểu nullable, hoặc được khai báo như một tham số tùy chọn. "

public class ValuesController : ApiController 
{ 
    public IEnumerable<string> Get(int page = 1) 
    { 
     return new string[] { page.ToString() }; 
    }  
} 

Mọi gợi ý về lý do này là gì?

Trả lời

5

thử thêm [FromUri] hoặc [FromForm] tham số thuộc tính.

public class ValuesController : ApiController 
{ 
    public IEnumerable<string> Get([FromUri]int page = 1) 
    { 
     return new string[] { page.ToString() }; 
    }  
} 

Mike Stall có hai bài đăng hay về ràng buộc tham số trong Webapi không hoạt động như trong ASP MVC. Vấn đề lớn để làm quen là bạn chỉ có thể đọc phần thân yêu cầu một lần trong đường ống của bạn. Vì vậy, nếu bạn cần đọc hơn 1 đối tượng phức tạp làm tham số, bạn có thể cần phải sử dụng tham số ModelBinding theo tham số. Tôi đã có một vấn đề tương tự như của bạn khi tôi đã đọc nội dung trước đó trong các đường ống cho mục đích đăng nhập và đã không nhận ra về đọc một lần hạn chế ở trên và đã phải giải quyết với chất kết dính mô hình tùy chỉnh của riêng tôi.

Giải thích ràng buộc tại http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx mô hình và sau đó cho thấy một cách để làm WebAPI mô hình ràng buộc giống như ASP MVC http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx

+0

Cảm ơn, sẽ đọc những bài đăng trên blog này, hy vọng rằng mọi thứ sẽ rõ ràng. –

+0

Có vẻ như đó là [FromUri] nowdays! – Olaj

0

Cố gắng xác định như Nullable<T>:

public class ValuesController : ApiController 
{ 
    public IEnumerable<string> Get(int? page = 1) 
    { 
     return new string[] { page.ToString() }; 
    }  
} 
+0

tôi đã giải quyết nó theo cách tương tự. Tôi đã không tìm kiếm một workaround ở đây, tôi muốn biết lý do tại sao các hành vi khác nhau giữa hai loại điều khiển. Cảm ơn vì câu trả lời. –

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