Почему атрибут «Маршрут» является обязательным для методов настраиваемого контроллера? - PullRequest
0 голосов
/ 23 октября 2018

Рассмотрим свежее веб-приложение Asp.Net Core 2.1 MVC, созданное с помощью шаблона Visual Studio 2017.Теперь рассмотрим пользовательское представление (MyView), а также контроллер (ActualController), чтобы структура проекта выглядела так, как показано на рисунке:

enter image description here

The MyView ничего особенного не показывает, и это неуместно.Однако страница должна появиться, когда пользователь вводит URL-адрес, например http://(domain)/desired/myview, или также через гиперссылку на домашней странице:

<a asp-area="" asp-controller="Desired" asp-action="MyView">MyView</a>

Теперь давайте сосредоточимся на контроллере, который является классом назван по-другому от того, что ожидает маршрутизация:

[Route("desired")]
public class ActualController : Controller
{
    [Route("MyView")]  //without this the method won't be called
    public IActionResult MyView()
    {
        return this.View();
    }
}

Из того, что я знаю, путем украшения контроллера атрибутом Route указывается распознаватель URL, чтобы соответствовать этому классу.Однако отображение работает только в том случае, если я явно добавлю (избыточный) атрибут Route в целевой метод / действие.Если я его удалю, путь не будет найден, и сервер вернет ошибку 404.

Вопрос в том, почему необходимо обязательно украшать Route метод, даже если действие неявноопределяется именем метода (как обычно)?

ПРИМЕЧАНИЕ: мне довольно просто переименовать класс контроллера, но я хотел бы знать, каковы причины такого поведения.

1 Ответ

0 голосов
/ 23 октября 2018

Вы переопределяете маршрут по умолчанию [controller]/[action] с [Route("desired")].Поскольку вы не определяете параметр действия на уровне контроллера, все другие маршруты должны выполняться явно.

Изменение верхнего параметра маршрута на [Route("desired/[action]")] должно решить его, и имя метода будет использоваться в качестве параметра.Вы по-прежнему можете переопределить отдельные действия, если хотите присвоить им имена по-разному, добавив к ним атрибут [Route("")].

Также см. документы (Замена токенов в шаблонах маршрутов) для дальнейшего описания впараметры маршрута

...