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

本文关键字:查询 字符串 处理 参数 路由 于属性 属性 | 更新日期: 2023-09-27 17:56:52

假设这些模型:

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(省略查询字符串参数),这将输出"filter=, skip=0, paging=0" - 因此参数设置为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 和分页都设置为 null。

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

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

对我来说

看起来像一个错字

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

为什么?因为它是根据您的类声明进行过滤、获取和跳过