ASP.NET Web API 项目模板如何使用这个 HelpPage 区域,就像它不是一个区域一样?

How does the ASP.NET Web API project template use this HelpPage area like it weren't an area?

在 Visual Studio 2017 社区(或任何版本)中打开一个新的 ASP.NET Web API 项目并 运行 它,您将看到一个欢迎页面,其中包含API超链接。

单击超链接,您将转到 url http://localhost:<port>/Help

这是 HelpPage 区域 HelpController 上的 Index 行动。

然而,令我困惑的是:

  1. HelpPage区域没有区域注册。

  2. 这个 ActionLink 调用是完全错误的。它说,"Please call the Index action on the HelpController within the default area-less area."

来自项目根目录中的_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]吗?这个区域的路由配置在哪里?如果不存在,路由应该通过在根无区域区域中声明的唯一默认路由,对吧?

有一个 Areas\HelpPage\HelpPageAreaRegistration.cs 文件负责区域注册,如下所示。
(我正在使用 Visual Studio 2017 企业版。)

请注意 HelpPageAreaRegistration class 注册了使用常量 url 模板部分 Help 的路由 Help/{action}/{apiId}区域名称 HelpPage.
(按照惯例,这条路线应该是 HelpPage/{controller}/{action}/{id}。)

这样做,您不必(也不能)在 @html.ActionLink 中指定区域名称,因为此控制器有一个 'explicit' 路由,可以避免与其他路由冲突,包括来自默认区域的那些。
此路由必须在 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);
    }
}