Я создаю пользовательский фильтр результатов, который реализует интерфейс IAsyncResultFilter . В этом фильтре мне нужно фактическое значение, возвращаемое действием, но мне также нужен параметр из этого действия (этот параметр берется из строки запроса и используется для разбивки на страницы).
Дело в том, что я не нашел способа получить значение параметра напрямую из ResultExecutingContext , то есть переменной, которую я имею в наличии в реализации фильтра результатов
Я пытался получить значение параметра, используя context.ActionDescriptor.Parameters, но это набор ParameterDescriptor, и я не смог получить из него фактическое значение, просто экземпляр ParameterDescriptor
Мне удалось получить mediaType из заголовков, а также саму строку запроса, но не строку запроса, связанную с типом PagingModel.
Есть ли способ получить этот параметр из переменной ResultExecutingContext ?
// Action from the ApiController
[HttpGet]
[AddPaginationHeader]
public async Task<IActionResult> Get([FromQuery]PagingModel pagingModel,
[FromHeader(Name = "Accept")]string mediaType) {
var pagedCollection = repository.GetPage(pagingModel);
var shapedCollection = ShapeCollectionOfData(pagedCollection);
return Ok(shapedCollection);
}
// AddPaginationHeader Implementation (Result Filter)
public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) {
var result = context.Result as ObjectResult;
if (result?.Value != null && result?.StatusCode >= 200 &&
result?.StatusCode < 300) {
// Trying to get the pagingModel (but getting a ParameterDescriptor type)
var pagingModel = context.ActionDescriptor.Parameters.Where(t=>t.Name.Equals("pagingModel")).FirstOrDefault();
//Getting the media type
string mediaType = context.HttpContext.Request.Headers["Accept"]
// Getting the query string itself
string queryString = context.HttpContext.Request.QueryString.ToString();
//Implementation of the actual logic that needs the paging model
// ...
next();
}
return Task.CompletedTask;
}