目前,我有以下方法为一组API的每个实体/资源提供分页:
public IHttpActionResult GetPageUsers(int startindex, int size, string sortby = "Username", string order = "DESC")
{
if (!order.Equals("ASC") && !order.Equals("DESC"))
return BadRequest("Order Has To Be DESC or ASC");
if (!new string[] { "username", "name" }.Contains(sortby.ToLower()))
return BadRequest("Not A Valid Sorting Column");
return Ok(new
{
records = Mapper.Map<List<User>, List<HomeBook.API.Models.User.UserDTO>>(
db.Users.OrderBy(sortby + " " + order).Skip(startindex).Take(size).ToList()
),
total = db.Users.Count()
});
}
但是我想将验证逻辑移到Model上,以便我可以从我的一个Action过滤器回复ModelState
个错误,并且请求甚至不需要进入控制器。
但是我也不能改变动作签名以期望一个对象参数,否则我得到multiple action error
。
基本上,我要问的是如何从这里删除验证逻辑到其他地方,以便请求甚至不需要进入操作。我非常感谢对这个问题的一些见解,甚至是一般的WebAPI中的分页
答案 0 :(得分:1)
您可以定义操作过滤器属性以执行验证:
public class ValidatePagingAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
string order = (string) actionContext.ActionArguments["order"];
string sortBy = (string) actionContext.ActionArguments["sortby"];
var states = new ModelStateDictionary();
if(!order.Equals("ASC") && !order.Equals("DESC"))
{
states.AddModelError("order", "Order has to be DESC or ASC");
}
if (!new[] { "username", "name" }.Contains(sortBy.ToLower()))
{
states.AddModelError("sortby", "Not A Valid Sorting Column");
}
if(states.Any())
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, states);
}
}
}
然后像这样使用它:
[ValidatePaging]
public IHttpActionResult GetPageUsers(int startindex, int size, string sortby = "Username", string order = "DESC")
{
// stuff
}
另外,请查看http://bitoftech.net/2013/11/25/implement-resources-pagination-asp-net-web-api如何在web api中实现分页。