Как шаблон проекта ASP.NET Web API использует эту область HelpPage, как будто она не была областью?

Откройте новый проект 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?
  1. Подождите, не должен ли быть маршрут по умолчанию для этого действия localhost:<port>/HelpPage/Help/[optional:Index]? Где конфигурация маршрута для этой области? Если он отсутствует, маршрутизация должна идти по единственному маршруту по умолчанию, объявленному в корневой области без области, верно?

1 ответ

Решение

Есть Areas\HelpPage\HelpPageAreaRegistration.cs file taking care of the area registrations, shown below.
(I'am using Visual Studio 2017 Enterprise edition.)

Обратите внимание, что HelpPageAreaRegistration class registers the route Help/{action}/{apiId} that uses a constant url-template part Help which doesn't match with the name of the area HelpPage,
(By convention, this route would have been HelpPage/{controller}/{action}/{id}.)

Doing so, you don't have to (and must not) specify the area name in the @html.ActionLink, as this controller has an 'explicit' route, which avoids conflicts with other routes, including those from the default area.
This route must be configured from within the AreaRegistration и не в RouteConfig in order for the views to be resolved from the appropriate views folder within this 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);
    }
}
Другие вопросы по тегам