2017-04-08 74 views
0

我有一個Area命名項目我試圖導航到。該區域有兩個名爲Project和Dashboard的Controller,每個都有一個Index操作。使用ASP NET Core MVC 6錨標籤助手到區域控制器

[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」時,它的工作原理 - 顯示視圖。然而,其在此視圖中的項目控制器定義了以下標籤幫手,我得到的網址http://localhost:1234/Project?area=Projects有沒有發現一個404:

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

URL需要是http://localhost:1234/Projects/Project。如果我在瀏覽器地址欄中輸入它,則會顯示「項目索引視圖」。我假設我的路線配置正確。

我試過asp-area =「Projects」,並且省略了asp區域標籤。我多次瀏覽了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 

如何從儀表板導航使用錨標記輔助程序的項目?

回答

2

我剛剛嘗試了一個新的應用程序,它工作正常。

您正在使用哪種版本的.Net Core?

我只是檢查implementation,它應該沒問題。也許有些包不匹配?

所以這裏是我的示例配置。我把區域航線上是這樣的:

Route

Controller

View

Generated URL

+0

有趣 - 我會更新問題。我也有這個問題,我不能在這個項目中使用以下技術添加控制器/視圖 - http://stackoverflow.com/questions/43291464/vs2017-asp-net-core-error-when-adding-a-razor - 查看 – Andez

+0

一場你的代碼和我的區別的遊戲。這似乎是路線的順序。首先添加區域 - 在默認路線之前。 – Andez

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?}"); 

} 

鑑於這種情況,我仍然覺得很奇怪,在直接輸入URL的工作。問題出在Tag Helpers上。

+0

嗯莫名其妙的網址生成(Generator.GenerateActionLink)不關心順序或以不同的方式使用它。我值得向MVC回購提交問題以獲得正確答案。 – Chrissx

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"> 

使用此URL給出預期的404響應。

在startup.cs中更改路由的順序,以便區域路由首先解決問題,並且URL現在是正確的。

我不知道爲什麼這是如此,並非常驚訝地發現,路由有任何控制的網址的代。這當然有能力再次把我趕出去,因爲我認爲這兩個是獨立的實體,而且只有在提出請求時才使用路由 - 似乎這不是一個正確的假設。

Gordon

相關問題