Web Api 2:如何让ModelState识别可选参数?

Web Api 2 : How to make ModelState recognize optional parameters?

我目前有这个控制器

[RoutePrefix("api/Home")]
public class HomeController : ApiController
{

    [HttpGet]
    [Route("")]
    public IHttpActionResult GetByIdAndAnotherID([FromUri]int? id, [FromUri]int? AnotherId ){

        if (!ModelState.IsValid) //From ApiController.ModelState
        {
            return BadRequest(ModelState);
        }
    }
}

当我尝试访问 /api/Home?id=&AnotherId=1/api/Home?id=1&AnotherId= 时,它 returns 出现以下错误 A value is required but was not present in the request. 我已明确指出 idAnotherId 应该是一个可选值。

为什么 ModelState 无效?我做错了什么?

您定义的路线是:

[Route("{id?}/{AnotherId?}")]

这意味着您可以这样称呼它 /api/Home/0/1 其中 0 将解析为 id 的值,而 1 将解析为 [=15 的值=].

我相信如果您删除该路由属性并只保留 [Route("")] 路由属性,您应该能够按预期调用该方法(/api/Home?id=&AnotherId=1/api/Home?id=1&AnotherId=)并且得到您期望的结果。

Web Api 中的 ModelState 似乎无法识别这种参数 ?a=&b=。不确定为什么,但我们需要 add a [BinderType] to [FormUri] 像这样:

[RoutePrefix("api/Home")]
public class HomeController : ApiController
{

    [HttpGet]
    [Route("")]
    public IHttpActionResult GetByIdAndAnotherID(
        [FromUri(BinderType = typeof(TypeConverterModelBinder))]int? ID = null,
        [FromUri(BinderType = typeof(TypeConverterModelBinder))]int? AnotherID = null){

        if (!ModelState.IsValid) //From ApiController.ModelState
        {
            return BadRequest(ModelState);
        }
    }
}