我很好奇为什么ApiController处理操作的默认参数值与“常规”控制器不同。
此代码工作正常,请求/ Test表示页面获取值1
public class TestController : Controller
{
public ActionResult Index(int page = 1)
{
return View(page);
}
}
当向/ api / Values发出请求时,此代码不起作用。它失败了:
“参数字典包含非可空类型'System.Int32'的参数'page'的空条目,用于方法'System.Collections.Generic.IEnumerable`1 [System.String] Get(Int32)'in' MvcApplication1.Controllers.Controllers.ValuesController'。可选参数必须是引用类型,可以为空的类型,或者声明为可选参数。“
public class ValuesController : ApiController
{
public IEnumerable<string> Get(int page = 1)
{
return new string[] { page.ToString() };
}
}
有关原因的任何提示?
答案 0 :(得分: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 by参数。当我在管道中早先阅读内容主体以进行日志记录时,我遇到了类似于你的问题,并且没有意识到上面的读取限制,并且必须使用我自己的自定义模型绑定器来解决。
在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
答案 1 :(得分:0)
尝试定义为Nullable<T>
:
public class ValuesController : ApiController
{
public IEnumerable<string> Get(int? page = 1)
{
return new string[] { page.ToString() };
}
}