【问题标题】:Default parameter value in MVC 4 Web APIMVC 4 Web API 中的默认参数值
【发布时间】:2012-04-19 17:38:12
【问题描述】:

我很好奇为什么 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() };
    }      
}

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

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    尝试添加 [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 的方法

    【讨论】:

    • 谢谢,会阅读这些博文,希望能解决问题。
    • 现在好像是 [FromUri]!
    【解决方案2】:

    尝试定义为Nullable&lt;T&gt;:

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

    【讨论】:

    • 我确实以类似的方式解决了它。我不是在这里寻找解决方法,我想知道为什么两种控制器类型之间的行为不同。不过感谢您的回答。
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2013-05-15
    • 2014-12-24
    • 2010-10-19
    • 2015-04-01
    相关资源
    最近更新 更多