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" });