我有这个网络 API 方法:
[HttpGet]
[Route("WorkPlanList/{clientsId}/{date:datetime}")]
public async Task<IHttpActionResult> WorkPlanList([FromUri]List<int> clientsId, [FromUri]DateTime date)
{
}
这是我用来调用上面的操作方法的 URI:
http://localhost/blabla/api/workPlan/WorkPlanList/5,4/2016-06-01
我在弯曲的括号上设置断点,看到日期时间值完美传递,而clientsId
值为0
.
知道为什么我得到0
on clientsId
?
You get 0
on clientsId
因为框架无法绑定该值4,5
在你的例子中List<int>
。在这种情况下,您使用自定义模型绑定器,它将将该值解析为您想要的类型并将其绑定到您的操作参数:
[RoutePrefix("blabla/api/workplan")]
public class WorkPlanController : ApiController {
[HttpGet]
[Route("WorkPlanList/{clientsId}/{date:datetime}")]
public IHttpActionResult WorkPlanList([ModelBinder(typeof(ClientsIdBinder))]List<int> clientsId, [FromUri]DateTime date) {
var result = new { clientsId, date };
return (Ok(result));
}
}
public class ClientsIdBinder : IModelBinder {
public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext) {
if (!typeof(IEnumerable<int>).IsAssignableFrom(bindingContext.ModelType)) {
return false;
}
var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (val == null) {
return false;
}
var ids = val.RawValue as string;
if (ids == null) {
return false;
}
var tokens = ids.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (tokens.Length > 0) {
var clientsId = tokens.Select(s => int.Parse(s));
if (bindingContext.ModelType.IsArray) {
bindingContext.Model = clientsId.ToArray();
} else {
bindingContext.Model = clientsId.ToList();
}
return true;
}
bindingContext.ModelState.AddModelError(
bindingContext.ModelName, "Cannot convert client ids");
return false;
}
}
参考:ASP.NET Web API 中的参数绑定 http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)