2012-04-19 48 views
5

我很好奇爲什麼ApiController處理與「常規」控制器不同的動作的默認參數值。MVC中的默認參數值4 Web API

此代碼工作得很好,請求/測試意味着頁面獲得價值1

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

當一個請求到/ API /值進行此代碼不能正常工作。它失敗:

「參數字典包含一個空的條目,用於方法System.Collections.Generic.IEnumerable`1 [System.String]的非可爲空的類型'System.Int32'的參數'page'Get( Int32)'in'MvcApplication1.Controllers.Controllers.ValuesController'。一個可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。「

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

任何提示爲什麼這是?

回答

5

嘗試添加[FromUri]或[FromForm]參數屬性。

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

Mike Stall在Webapi中有兩個關於參數綁定的好帖子,它不像ASP MVC中那樣工作。習慣的大問題是,你只能在管道中讀取一次請求主體。因此,如果您需要讀取多個複雜對象作爲參數,則可能需要通過參數使用ModelBinding。當我在管道中讀取內容主體時,出於記錄目的,我沒有遇到類似於您的問題,並且沒有意識到上面的一次讀取限制,必須使用我自己的自定義模型綁定器解決。

解釋模型在http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx綁定,然後提出一個令的WebAPI模型綁定更像ASP MVC http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx

+0

謝謝,將閱讀這些博客文章,希望這將清除事情。 – 2012-04-26 10:26:57

+0

今天好像是[FromUri]! – Olaj 2013-02-05 08:53:20

0

嘗試定義爲Nullable<T>

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

我並解決它以類似的方式。我沒有在這裏尋找解決方法,我想知道爲什麼兩種控制器類型之間的行爲不同。但感謝您的答案。 – 2012-04-26 10:28:09