ASP.NET Core Route атрибуты доступны во всем классе контроллера - PullRequest
2 голосов
/ 15 марта 2019

Есть ли способ сделать атрибуты, указанные в маршруте, доступными для всего класса?Например, рассмотрим этот контроллер:

[Route("api/store/{storeId}/[controller]")]
public class BookController
{
    [HttpGet("{id:int:min(1)}")]
    public async Task<IActionResult> GetBookById(int storeId, int id)
    {
    }
}

И этот запрос:

/api/store/4/book/1

Внутри метода GetBookById переменная storeId правильно заполнена значением 4, а переменная id - значением 1. Однаковместо того, чтобы передавать переменную storeId в каждом методе BookController, есть способ сделать что-то вроде этого:

[Route("api/store/{storeId}/[controller]")]
public class BookController
{
    private int storeId;

    [HttpGet("{id:int:min(1)}")]
    public async Task<IActionResult> GetBookById(int id)
    {
        //use value of storeId here
    }
}

1 Ответ

2 голосов
/ 15 марта 2019

Если контроллер наследует от Controller класса, вы можете переопределить метод OnActionExecuting, если контроллер наследует от ControllerBase, вам необходимо реализовать интерфейс IActionFilter, чтобы он работал

[Route("api/store/{storeId}/[controller]")]
public class BookController : ControllerBase, IActionFilter
{
    private int storeId;

    [HttpGet("{id:int:min(1)}")]
    public async Task<IActionResult> GetBookById(int id)
    {
        // use value of storeId here
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        //empty
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        string value = context.RouteData.Values["storeId"].ToString();
        int.TryParse(value, out storeId);
    }
}
...