使用ASP NET Core MVC 6 Anchor Tag Helper到区域控制器

时间:2017-04-08 12:42:58

标签: asp.net asp.net-core-mvc

我正在尝试导航到Area个名为Projects的项目。该区域有两个名为Project和Dashboard的Controller,每个都有一个Index动作。

[Authorize]
[Area("Projects")]
public class ProjectController : Controller
{
    ...
}

[Authorize]
[Area("Projects")]
public class DashboardController : Controller
{
    ...
}

我在Startup.cs中定义了以下路由。

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");

    routes.MapRoute(
        name: "Projects",
        template: "{area}/{controller}/{action}/{id?}");

    ...
});

当我在其显示的仪表板中键入网址“http://localhost:1234:Projects/Dashboard”时,将显示该视图。但是,在此视图中为Project控制器定义了以下标记帮助程序,我得到的网址http://localhost:1234/Project?area=Projects找不到404:

<a asp-area="Projects" asp-controller="Project" asp-action="Index">
    <span>Goto Project</span>
</a>

网址必须为http://localhost:1234/Projects/Project。如果我在浏览器地址栏中输入该内容,则会显示“项目索引视图”。我假设我的路线配置正确。

我尝试了asp-area =“Projects”并省略了asp-area标签。我多次在area docsrouting docs拖网无效。

我的目标是.NET Framework 4.6.2。以下是csproj感兴趣的领域:

<PropertyGroup>
    <TargetFramework>net462</TargetFramework>
    <RuntimeIdentifier>win7-x86</RuntimeIdentifier>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Identity" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="1.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.0" PrivateAssets="All" />
    <PackageReference Include="SimpleInjector.Integration.AspNetCore.Mvc" Version="3.3.2" />
    <PackageReference Include="Telerik.UI.for.AspNet.Core" Version="2017.1.223" />
</ItemGroup>
<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.0" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
</ItemGroup>

我在项目的根级创建了一个名为Areas的文件夹。即:

ACMEMVCWebApp\Areas\Projects
ACMEMVCWebApp\Areas\Projects\Controllers
ACMEMVCWebApp\Areas\Projects\Views

如何使用Anchor Tag Helper从仪表板导航到Project?

3 个答案:

答案 0 :(得分:2)

我刚试过一个新的应用程序,它工作正常。

您使用的是哪个版本的.Net Core?

我只是检查implementation,它应该没问题。也许一些包装不匹配?

所以这是我的示例配置。我把区域路线放到这个顶部:

Route

Controller

View

Generated URL

答案 1 :(得分:1)

我也有这个问题,为区域内的控制器动作生成正确的URL。我找到了一些可能对某些问题感兴趣的修复程序。

路线的顺序是为操作创建正确的网址的问题。在我的情况下,我正在为表单生成操作,并将一些代码从MVC 5移动到MVC Core 2.0。原始代码使用了这样的html帮助器:

@using (Html.BeginForm())

并产生以下正确的标记:

<form action="/Admin/Role/Create?_=1505204033132" method="post">

然后我更新了代码以使用标记助手,因为我非常喜欢语法。我把上面改为:

<form asp-area="Admin" asp-controller="Role" asp-action="Create" method="post">

这没有创建正确的网址。它生成的代码如下所示:

<form method="post" action="/Role/Create?area=Admin">

使用此网址会给出预期的404响应。

在startup.cs中更改路由的顺序,以便首先修复区域路径问题,并且网址现在是正确的。

我不知道为什么会这样,并且非常惊讶地发现路由可以控制url的生成。这当然有能力再次把我赶出去,因为我认为这两个是独立的实体,并且路由仅在请求发生时使用 - 似乎这不是一个正确的假设。

戈登

答案 2 :(得分:0)

引用documentation

Routes in the route collection are ordered, and will be processed in the order they are added. So in this example, the blog route will be tried before the default route.

所以这需要在默认路线之前成为区域:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "Projects",
        template: "{area}/{controller}/{action}/{id?}");

    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");

}

考虑到这一点,我仍然觉得输入直接工作的网址很奇怪。问题出在Tag Helpers上。