小编car*_*rio的帖子

如何创建自定义结果过滤器以向来自 webapi 控制器的响应添加分页标头

我有以下场景:

我想创建一个自定义结果过滤器,允许我使用ResultFilterAttribute类的子类向响应添加分页标题。为了创建标题中使用的分页元数据,我创建了一个分页助手服务,该服务被注入到控制器类中,并且需要一个 PagingModel 对象来生成元数据。

要将分页元数据添加到过滤器中的响应,我需要访问 pagingMetadata 和我想从控制器返回的实际值(实体、dto 或其他任何值)。为了能够将两个对象传递给结果过滤器,我使用了一个元组。

问题是我想让这个过滤器有点通用,我试图将来自控制器的实际值(实体,dto ...)转换为一个对象,这给我抛出一个异常,说转换不是可能的。

我该如何进行选角?或者我应该使用不同的方法吗?

我尝试直接在结果过滤器中使用 paginationHelperService 而不是在控制器中使用它,但是不可能从控制器传递服务的实例,因为属性类不允许它。

我也尝试使用泛型,我认为这是实现转换的最简单方法。如果我可以使属性通用,我可以将对象转换为其实际类型,但不幸的是,这是不可能的,因为它是一个属性类。


// Controller
[HttpGet]
[AddPaginationHeader]
public async Task<IActionResult> Get([FromQuery]PagingModel pagingModel, 
    [FromHeader(Name = "Accept")]string mediaType) {
    var pagedCollection = repository.GetPage(pagingModel);
    PaginationMetadata paginationMetadata = paginationHelperService.GetPagingMetadata(pagingModel);
    if (mediaType == "mycustommediatype") {
        var shapedCollection = ShapeCollectionOfData(pagedCollection);
        return Ok((shapedCollection, pagingModel));
    } else {
        return Ok((pagedCollection, pagingModel));
    }
}

// Custom Result Filter
public override void OnResultExecuting(ResultExecutingContext context) {
    var result = context.Result as ObjectResult;
    if …
Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core asp.net-core-webapi

4
推荐指数
1
解决办法
642
查看次数

标签 统计

.net-core ×1

asp.net-core ×1

asp.net-core-webapi ×1

c# ×1