Web API中的分页

时间:2014-11-03 09:59:39

标签: c# rest asp.net-web-api pagination

目前,我有以下方法为一组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中的分页

1 个答案:

答案 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中实现分页。