ASP Core: как настроить область для контроллера api без AreaAttribute (или как включить маршрутизацию конвенционной области для контроллера Api)? - PullRequest
0 голосов
/ 26 января 2019

Razor Pages не нужны никакие AreaAttribute, и их достаточно поместить в папку Areas/MyArea/Pages, и этого достаточно, чтобы включить маршрутизацию /MyArea/MyPage

+ My Proj
    + Areas
        + MyArea
            + Pages
                - MyPage.cshtml

Но когда я помещаю API ControlllerMyApi.cs в MyArea папку:

+ My Proj
    + Areas
        + MyArea
            + Pages
            - MyApi.cs

, тогда я вынужден «жестко закодировать» имя области

[Area("MyArea")] // !!! can't be missed
[Route("[area]/api/[action]")]
[Produces("application/json")]
[ApiController]
public class MyApiController : ControllerBase { // ...

Я не могу пропустить / пропустить AreaAttribute из-за запускавремя error Error: While processing template '[area]/api', a replacement value for the token 'area' could not be found. Available tokens: 'action, controller'. To use a '[' or ']' as a literal string in a route or within a constraint, use '[[' or ']]' instead.

Как Razor Pages работают без него и как заставить MyApiController работать без ApiController - просто следовать соглашениям Razor Pages (я хочу избежать явного жесткого кодирования области)?

PS для меня нормально удалить все атрибуты "api" не только Area, но и Produces, ApiController ..., поскольку метод моего контроллера api проходит ContentResult { Content = json, ContentType = "application/json" }, и мне фактически не нужна их функциональность.

PPS Интересно, что Razor Pages PageModel содержит метод GetArea(), а ControllerBase - нет.Похоже, у них разные механизмы определения area.

Эти опции не работают:

routes.MapAreaRoute("Configuration", "Configuration", "Configuration/{controller}/{action}");

или

routes.MapRoute("Configuration", "Configuration/{controller}/{action}",
     defaults: new { area = "Configuration" }, 
     constraints: new { area = "Configuration" });

или

routes.MapRoute("Configuration", "Configuration/ConfigurationApi/{action}",
                defaults: new { area = "Configuration", controller = "ConfigurationApi" }, 
                constraints: new { area = "Configuration", controller = "ConfigurationApi" });
...