5

我很好奇为什么 ApiController 处理动作的默认参数值与“常规”控制器不同。

这段代码工作得很好,请求 /Test 意味着页面获取值 1

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

当向 /api/Values 发出请求时,此代码不起作用。它失败了:

“参数字典包含不可为空类型‘System.Int32’的参数‘页面’的空条目,用于‘MvcApplication1.Controllers’中的方法‘System.Collections.Generic.IEnumerable`1[System.String] Get(Int32)’ .Controllers.ValuesController'。可选参数必须是引用类型、可空类型或声明为可选参数。”

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

关于为什么会这样的任何提示?

4

2 回答 2

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 中那样工作。要习惯的一个大问题是您只能在管道中读取一次请求正文。因此,如果您需要读取 1 个以上的复杂对象作为参数,您可能需要通过参数求助于 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

于 2012-04-20T01:40:43.367 回答
0

尝试定义为Nullable<T>

public class ValuesController : ApiController
{
    public IEnumerable<string> Get(int? page = 1)
    {
        return new string[] { page.ToString() };
    }      
}
于 2012-04-19T19:02:44.610 回答