基于属性的路由和处理省略的查询字符串参数

时间:2015-06-17 18:30:24

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

假设这些模型:

public class PagingModel
{
    public int Skip { get; set; }
    public int Take { get; set; }
}

public class FilterModel
{
    public string Filter { get; set; }
}

假设标准路由(基于WebApiConfig.cs中的路由映射)和Web API控制器:

public class ValuesController : ApiController
{
    public async Task<IHttpActionResult> Get([FromUri] FilterModel filterModel, [FromUri] PagingModel paging)
    {
        return Content(HttpStatusCode.OK, "filter=" + filterModel.Filter + ", skip=" + paging.Skip + ", take=" + paging.Take);
    }
}

如果我点击http://localhost:12345/api/values(省略查询字符串参数),则输出&#34; filter =,skip = 0,paging = 0&#34; - 因此参数设置为FilterModel和PagingModel的空实例。

现在假设使用相同的控制器,但使用基于属性的路由:

[RoutePrefix("api/testing")]
public class ValuesController : ApiController
{
    [Route("")]
    public async Task<IHttpActionResult> Get([FromUri] FilterModel filterModel, [FromUri] PagingModel paging)
    {
        return Content(HttpStatusCode.OK, "filter=" + filterModel.Filter + ", skip=" + paging.Skip + ", take=" + paging.Take);
    }
}

如果我现在点击http://localhost:12345/api/testing(再次省略查询字符串参数),我得到一个空引用异常 - filterModel和paging都设置为null。

造成这种差异的原因是什么?这两种路由机制是否以某种方式使用不同的ModelBinder?

1 个答案:

答案 0 :(得分:0)

看起来像是一个错字

在第二个示例中,filterModel.filterpaging.takepaging.skip不存在,导致空引用异常。

为什么?因为它是根据你的班级声明过滤,取和跳过