Как шаблон проекта ASP.NET Web API использует эту область HelpPage, как будто она не была областью? - PullRequest
0 голосов
/ 28 ноября 2018

Откройте новый проект ASP.NET Web API в сообществе Visual Studio 2017 (или любой другой редакции) и запустите его, и вы увидите страницу приветствия с гиперссылкой API .

Нажмите на гиперссылку, и она приведет вас к URL http://localhost:<port>/Help.

Это действие Index для HelpController в области HelpPage.

Однако, что меня смущаетПо следующему:

  1. Нет регистрации области для HelpPage области.

  2. Этот ActionLink вызов является совершенно неправильным.Он говорит: «Пожалуйста, вызовите действие Index для HelpController в пределах области по умолчанию без области.»

Из _Layout.cshtml в корневом каталоге проекта

<li>@Html.ActionLink("API", "Index", "Help", new { area = "" }, null)</li>

That's outright abusive. How does that work?
Подождите, не должен ли маршрут по умолчанию для этого действия быть localhost:<port>/HelpPage/Help/[optional:Index]?Где конфигурация маршрута для этой области?Если он отсутствует, маршрутизация должна идти по единственному маршруту по умолчанию, объявленному в корневой области без области, верно?

1 Ответ

0 голосов
/ 28 ноября 2018

Существует файл Areas\HelpPage\HelpPageAreaRegistration.cs, обеспечивающий регистрацию областей, как показано ниже.
(я использую выпуск Visual Studio 2017 Enterprise.)

Обратите внимание, чтоКласс HelpPageAreaRegistration регистрирует маршрут Help/{action}/{apiId}, который использует постоянную часть шаблона URL Help, которая не соответствует названию области HelpPage.
(По соглашению, этот маршрут был бы HelpPage/{controller}/{action}/{id}.)

При этом вам не нужно (и не нужно) указывать имя области в @html.ActionLink, поскольку у этого контроллера есть «явный» маршрут, который позволяет избежать конфликтов с другими маршрутами,в том числе из области по умолчанию.
Этот маршрут должен быть настроен из AreaRegistration, а не из RouteConfig, чтобы разрешить виды из соответствующей папки представлений в этой области HelpPage.

public class HelpPageAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get{ return "HelpPage"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "HelpPage_Default",
            "Help/{action}/{apiId}",
            new { controller = "Help", action = "Index", apiId = UrlParameter.Optional });

        HelpPageConfig.Register(GlobalConfiguration.Configuration);
    }
}
...