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.
我已明确指出 id
或 AnotherId
应该是一个可选值。
为什么 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);
}
}
}
我目前有这个控制器
[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.
我已明确指出 id
或 AnotherId
应该是一个可选值。
为什么 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);
}
}
}