Asp.net mvc 4 MVC4WebAPI中的默认参数值

Asp.net mvc 4 MVC4WebAPI中的默认参数值,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我很好奇为什么ApiController处理动作的默认参数值不同于“常规”控制器 此代码工作正常,请求/测试意味着页面获得值1 public class TestController : Controller { public ActionResult Index(int page = 1) { return View(page); } } 当向/api/Values发出请求时,此代码不起作用。它失败于: “对于方法'System.Collections

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

此代码工作正常,请求/测试意味着页面获得值1

public class TestController : Controller
{
    public ActionResult Index(int page = 1)
    {
        return View(page);
    }
}
当向/api/Values发出请求时,此代码不起作用。它失败于:

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

公共类值控制器:ApiController
{
公共IEnumerable Get(int page=1)
{
返回新字符串[]{page.ToString()};
}      
}

有关于为什么会这样的提示吗?

尝试定义为
可为空的

公共类值控制器:ApiController
{
公共IEnumerable Get(int?page=1)
{
返回新字符串[]{page.ToString()};
}      
}

尝试添加[FromUri]或[FromForm]参数属性

public class ValuesController : ApiController
{
    public IEnumerable<string> Get([FromUri]int page = 1)
    {
        return new string[] { page.ToString() };
    }      
}
公共类值控制器:ApiController
{
public IEnumerable Get([FromUri]int page=1)
{
返回新字符串[]{page.ToString()};
}      
}
Mike Stall有两篇关于Webapi中的参数绑定的好文章,这篇文章不像ASP MVC中那样有效。要习惯的大问题是,在管道中只能读取一次请求主体。因此,如果您需要读取多个复杂对象作为参数,则可能需要通过参数进行ModelBinding。我遇到了一个类似于您的问题,当时我正在管道中阅读内容正文以进行日志记录,没有意识到上面的“一次读取”限制,必须使用我自己的自定义模型绑定器来解决


在上解释模型绑定,然后建议一种使WebAPI模型绑定更像ASP MVC的方法

谢谢,我将阅读这些博客文章,希望这能澄清问题。现在好像是[FromUri]!我确实以类似的方式解决了这个问题。我不是在寻找解决方法,我想知道为什么这两种控制器的行为不同。谢谢你的回答。
public class ValuesController : ApiController
{
    public IEnumerable<string> Get(int? page = 1)
    {
        return new string[] { page.ToString() };
    }      
}
public class ValuesController : ApiController
{
    public IEnumerable<string> Get([FromUri]int page = 1)
    {
        return new string[] { page.ToString() };
    }      
}