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
行动。
然而,令我困惑的是:
HelpPage
区域没有区域注册。
这个 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?
- 等等,这个动作的默认路由不应该是
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);
}
}
在 Visual Studio 2017 社区(或任何版本)中打开一个新的 ASP.NET Web API 项目并 运行 它,您将看到一个欢迎页面,其中包含API超链接。
单击超链接,您将转到 url http://localhost:<port>/Help
。
这是 HelpPage
区域 HelpController
上的 Index
行动。
然而,令我困惑的是:
HelpPage
区域没有区域注册。这个
ActionLink
调用是完全错误的。它说,"Please call theIndex
action on theHelpController
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?
- 等等,这个动作的默认路由不应该是
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);
}
}