Formazione
Modulo
Creare un progetto .NET Aspire - Training
Informazioni su come creare applicazioni native del cloud da zero o aggiungere orchestrazione a un'app esistente usando lo stack .NET Aspire in .NET 8.
Questo browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Di Dhananjay Kumar e Rick Anderson
Le aree sono una funzionalità di ASP.NET usata per organizzare le funzionalità correlate in un gruppo come separato:
L'uso di aree crea una gerarchia per lo scopo del routing aggiungendo un altro parametro di route, area
, a controller
e action
o una Razor pagina page
.
Le aree consentono di partizionare un'app Web core ASP.NET in gruppi funzionali più piccoli, ognuno con un proprio set di Razor pagine, controller, visualizzazioni e modelli. Un'area è in effetti una struttura all'interno di un'app. In un progetto Web ASP.NET Core i componenti logici come pagine, modello, controller e visualizzazione si trovano in cartelle diverse. Il runtime di ASP.NET Core crea una relazione tra questi componenti usando convenzioni di denominazione. Per un'app di grandi dimensioni può risultare utile suddividere l'app in aree di funzionalità di alto livello distinte. È il caso, ad esempio, di un'app di e-commerce con più business unit, ad esempio per il completamento della transazione, la fatturazione e la ricerca. Ognuna di queste unità ha una propria area per contenere visualizzazioni, controller, Razor pagine e modelli.
In un progetto è consigliabile usare le aree quando:
Se si usano Razor pagine, vedere Aree con Razor pagine in questo documento.
Una tipica app Web ASP.NET Core che usa aree, controller e visualizzazioni contiene quanto segue:
Controller con l'attributo [Area]
per associare il controller all'area:
[Area("Products")]
public class ManageController : Controller
{
Percorso dell'area aggiunto a Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Si consideri un'applicazione che ha due gruppi logici, Prodotti e Servizi. Usando le aree, la struttura delle cartelle sarebbe simile alla seguente:
Anche se il layout precedente è tipico quando si usano le aree, per usare questa struttura di cartelle sono necessari solo i file delle visualizzazioni. L'individuazione delle visualizzazioni cercherà un file di visualizzazione area corrispondente in quest'ordine:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
/Pages/Shared/<Action-Name>.cshtml
I controller di area sono designati con l'attributo [Area]
:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Docs.Samples;
namespace MVCareas.Areas.Products.Controllers;
[Area("Products")]
public class ManageController : Controller
{
public IActionResult Index()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
public IActionResult About()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
}
Le route di area usano in genere il routing convenzionale anziché il routing degli attributi. Il routing convenzionale dipende dall'ordinamento. In generale, le route con aree devono essere posizionate prima delle altre nella tabella di route poiché sono più specifiche rispetto alle route senza un'area.
{area:...}
può essere usato come token nei modelli di route se lo spazio URL è uniforme in tutte le aree:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Nel codice precedente, exists
applica il vincolo che la route deve corrispondere a un'area. Uso di {area:...}
con MapControllerRoute
:
[Area("Area name")]
.Il codice seguente usa MapAreaControllerRoute per creare due route di area denominate:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapAreaControllerRoute(
name: "MyAreaProducts",
areaName: "Products",
pattern: "Products/{controller=Home}/{action=Index}/{id?}");
app.MapAreaControllerRoute(
name: "MyAreaServices",
areaName: "Services",
pattern: "Services/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Per altre informazioni, vedere Aree.
Il codice seguente dal download di esempio mostra la generazione di collegamenti con l'area specificata:
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-controller="Home" asp-action="About">
Products/Home/About
</a>
</li>
<li>
<a asp-area="Services" asp-controller="Home" asp-action="About">
Services About
</a>
</li>
<li>
<a asp-area="" asp-controller="Home" asp-action="About">
/Home/About
</a>
</li>
</ul>
<li>Html.ActionLink generated links</li>
<ul>
<li>
@Html.ActionLink("Product/Manage/About", "About", "Manage",
new { area = "Products" })
</li>
</ul>
<li>Url.Action generated links</li>
<ul>
<li>
<a href='@Url.Action("About", "Manage", new { area = "Products" })'>
Products/Manage/About
</a>
</li>
</ul>
Il download di esempio include una visualizzazione parziale che contiene:
area
del fatto che non sono specificati.La visualizzazione parziale viene referenziata nel file di layout, in modo che ogni pagina nell'app mostri i collegamenti generati. I collegamenti generati senza specificare l'area sono validi solo quando sono referenziati da una pagina nella stessa area e controller.
Quando l'area o il controller non sono specificati, il routing dipende dai valori di ambiente. I valori di route correnti della richiesta corrente sono considerati valori di ambiente per la generazione del collegamento. In molti casi per l'app di esempio, l'uso dei valori di ambiente genera collegamenti non corretti con il markup che non specifica l'area.
Per altre informazioni, vedere Routing ad azioni del controller.
Per condividere un layout comune per l'intera app, mantenere il _ViewStart.cshtml nella cartella radice dell'applicazione. Per altre informazioni, vedere Layout in ASP.NET Core
La cartella radice dell'applicazione è la cartella contenente il Program.cs
file in un'app Web creata con i modelli ASP.NET Core.
/Views/_ViewImports.cshtml, per MVC e /Pages/_ViewImports.cshtml per Razor Pages, non viene importato nelle visualizzazioni nelle aree. Usare uno degli approcci seguenti per fornire le importazioni di visualizzazione a tutte le visualizzazioni:
Il file _ViewImports.cshtml contiene in genere istruzioni Tag Helpers imports, @using
, e @inject
. Per altre informazioni, vedere Importazione di direttive condivise.
Il codice seguente modifica la cartella dell'area predefinita da "Areas"
a "MyAreas"
:
using Microsoft.AspNetCore.Mvc.Razor;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Le aree con Razor Pagine richiedono una Areas/<area name>/Pages
cartella nella radice dell'app. La struttura di cartelle seguente viene usata con l'app di esempio:
Il codice seguente dal download di esempio mostra la generazione di collegamenti con l'area specificata (ad esempio, asp-area="Products"
):
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-page="/About">
Products/About
</a>
</li>
<li>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-area="" asp-page="/About">
/About
</a>
</li>
</ul>
<li>Url.Page generated links</li>
<ul>
<li>
<a href='@Url.Page("/Manage/About", new { area = "Services" })'>
Services/Manage/About
</a>
</li>
<li>
<a href='@Url.Page("/About", new { area = "Products" })'>
Products/About
</a>
</li>
</ul>
Il download di esempio include una visualizzazione parziale che contiene i collegamenti precedenti e gli stessi collegamenti senza specificare l'area. La visualizzazione parziale viene referenziata nel file di layout, in modo che ogni pagina nell'app mostri i collegamenti generati. I collegamenti generati senza specificare l'area sono validi solo in caso di riferimento da una pagina nella stessa area.
Quando l'area non è specificata, il routing dipende dai valori di ambiente. I valori di route correnti della richiesta corrente sono considerati valori di ambiente per la generazione del collegamento. In molti casi per l'app di esempio, l'uso dei valori di ambiente genera collegamenti non corretti. Si considerino, ad esempio, i collegamenti generati dal codice seguente:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Per il codice precedente:
<a asp-page="/Manage/About">
è corretto solo quando l'ultima richiesta riguarda una pagina nell'area Services
. Ad esempio, /Services/Manage/
, /Services/Manage/Index
o /Services/Manage/About
.<a asp-page="/About">
è corretto solo quando l'ultima richiesta riguarda una pagina in /Home
.È possibile aggiungere un file _ViewImports.cshtml a ogni cartella Pagine dell'area per importare lo spazio dei nomi e gli helper tag in ogni Razor pagina della cartella.
Prendere in considerazione l'area Services del codice di esempio, che non contiene un file _ViewImports.cshtml. Il markup seguente mostra la pagina /Services/Manage/AboutRazor :
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
ViewData["Title"] = "Srv Mng About";
}
<div>
ViewData["routeInfo"]: @ViewData["routeInfo"]
</div>
<a asp-area="Products" asp-page="/Index">
Products/Index
</a>
Nel markup precedente:
@model RPareas.Areas.Services.Pages.Manage.AboutModel
).@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Nel download di esempio, l'area Products contiene il file _ViewImports.cshtml seguente:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Il markup seguente mostra la pagina /Products/AboutRazor :
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
Nel file precedente lo spazio dei nomi e la direttiva @addTagHelper
vengono importati dal file Areas/Products/Pages/_ViewImports.cshtml.
Per altre informazioni, vedere Gestione dell'ambito dell'helper tag e Importazione delle direttive condivise.
Per condividere un layout comune per l'intera app, spostare _ViewStart.cshtml nella cartella radice dell'applicazione.
Tutti i file *.cshtml e i file all'interno della directory wwwroot vengono pubblicati nell'output quando <Project Sdk="Microsoft.NET.Sdk.Web">
è incluso nel file *.csproj.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere > con scaffolding, quindi selezionare Area MVC.
Controller
e Razor Page
.Le aree sono una funzionalità di ASP.NET usata per organizzare le funzionalità correlate in un gruppo come separato:
L'uso di aree crea una gerarchia per lo scopo del routing aggiungendo un altro parametro di route, area
, a controller
e action
o una Razor pagina page
.
Le aree consentono di partizionare un'app Web core ASP.NET in gruppi funzionali più piccoli, ognuno con un proprio set di Razor pagine, controller, visualizzazioni e modelli. Un'area è in effetti una struttura all'interno di un'app. In un progetto Web ASP.NET Core i componenti logici come pagine, modello, controller e visualizzazione si trovano in cartelle diverse. Il runtime di ASP.NET Core crea una relazione tra questi componenti usando convenzioni di denominazione. Per un'app di grandi dimensioni può risultare utile suddividere l'app in aree di funzionalità di alto livello distinte. È il caso, ad esempio, di un'app di e-commerce con più business unit, ad esempio per il completamento della transazione, la fatturazione e la ricerca. Ognuna di queste unità ha una propria area per contenere visualizzazioni, controller, Razor pagine e modelli.
In un progetto è consigliabile usare le aree quando:
Visualizzare o scaricare il codice di esempio (procedura per il download). Il download di esempio fornisce un'app di base per testare le aree.
Se si usano Razor pagine, vedere Aree con Razor pagine in questo documento.
Una tipica app Web ASP.NET Core che usa aree, controller e visualizzazioni contiene quanto segue:
Controller con l'attributo [Area]
per associare il controller all'area:
[Area("Products")]
public class ManageController : Controller
{
La route di area aggiunta all'avvio:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Si consideri un'applicazione che ha due gruppi logici, Prodotti e Servizi. Usando le aree, la struttura delle cartelle sarebbe simile alla seguente:
Anche se il layout precedente è tipico quando si usano le aree, per usare questa struttura di cartelle sono necessari solo i file delle visualizzazioni. L'individuazione delle visualizzazioni cercherà un file di visualizzazione area corrispondente in quest'ordine:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
/Pages/Shared/<Action-Name>.cshtml
I controller di area sono designati con l'attributo [Area] :
using Microsoft.AspNetCore.Mvc;
using Microsoft.Docs.Samples;
namespace MVCareas.Areas.Products.Controllers
{
[Area("Products")]
public class ManageController : Controller
{
public IActionResult Index()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
public IActionResult About()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
}
}
Le route di area usano in genere il routing convenzionale anziché il routing degli attributi. Il routing convenzionale dipende dall'ordinamento. In generale, le route con aree devono essere posizionate prima delle altre nella tabella di route poiché sono più specifiche rispetto alle route senza un'area.
{area:...}
può essere usato come token nei modelli di route se lo spazio URL è uniforme in tutte le aree:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Nel codice precedente, exists
applica il vincolo che la route deve corrispondere a un'area. Uso di {area:...}
con MapControllerRoute
:
[Area("Area name")]
.Il codice seguente usa MapAreaControllerRoute per creare due route di area denominate:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
name: "MyAreaProducts",
areaName: "Products",
pattern: "Products/{controller=Home}/{action=Index}/{id?}");
endpoints.MapAreaControllerRoute(
name: "MyAreaServices",
areaName: "Services",
pattern: "Services/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Per altre informazioni, vedere Aree.
Il codice seguente dal download di esempio mostra la generazione di collegamenti con l'area specificata:
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-controller="Home" asp-action="About">
Products/Home/About
</a>
</li>
<li>
<a asp-area="Services" asp-controller="Home" asp-action="About">
Services About
</a>
</li>
<li>
<a asp-area="" asp-controller="Home" asp-action="About">
/Home/About
</a>
</li>
</ul>
<li>Html.ActionLink generated links</li>
<ul>
<li>
@Html.ActionLink("Product/Manage/About", "About", "Manage",
new { area = "Products" })
</li>
</ul>
<li>Url.Action generated links</li>
<ul>
<li>
<a href='@Url.Action("About", "Manage", new { area = "Products" })'>
Products/Manage/About
</a>
</li>
</ul>
Il download di esempio include una visualizzazione parziale che contiene:
area
del fatto che non sono specificati.La visualizzazione parziale viene referenziata nel file di layout, in modo che ogni pagina nell'app mostri i collegamenti generati. I collegamenti generati senza specificare l'area sono validi solo quando sono referenziati da una pagina nella stessa area e controller.
Quando l'area o il controller non sono specificati, il routing dipende dai valori di ambiente. I valori di route correnti della richiesta corrente sono considerati valori di ambiente per la generazione del collegamento. In molti casi per l'app di esempio, l'uso dei valori di ambiente genera collegamenti non corretti con il markup che non specifica l'area.
Per altre informazioni, vedere Routing ad azioni del controller.
Per condividere un layout comune per l'intera app, mantenere _ViewStart.cshtml
nella cartella radice dell'applicazione. Per altre informazioni, vedere Layout in ASP.NET Core
La cartella radice dell'applicazione è la cartella contenente Startup.cs
nell'app Web creata con i modelli di base ASP.NET.
/Views/_ViewImports.cshtml
, per MVC e /Pages/_ViewImports.cshtml
per Razor Pages, non viene importato nelle visualizzazioni nelle aree. Usare uno degli approcci seguenti per fornire le importazioni di visualizzazione a tutte le visualizzazioni:
_ViewImports.cshtml
alla cartella radice dell'applicazione. Un _ViewImports.cshtml
nella cartella radice dell'applicazione verrà applicato a tutte le visualizzazioni nell'app._ViewImports.cshtml
file nella cartella di visualizzazione appropriata nelle aree.Il _ViewImports.cshtml
file contiene in genere importazioni di helper tag, @using
istruzioni e @inject
. Per altre informazioni, vedere Importazione di direttive condivise.
Il codice seguente modifica la cartella dell'area predefinita da "Areas"
a "MyAreas"
:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
services.AddControllersWithViews();
}
Le aree con Razor Pagine richiedono una Areas/<area name>/Pages
cartella nella radice dell'app. La struttura di cartelle seguente viene usata con l'app di esempio:
Il codice seguente dal download di esempio mostra la generazione di collegamenti con l'area specificata (ad esempio, asp-area="Products"
):
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-page="/About">
Products/About
</a>
</li>
<li>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-area="" asp-page="/About">
/About
</a>
</li>
</ul>
<li>Url.Page generated links</li>
<ul>
<li>
<a href='@Url.Page("/Manage/About", new { area = "Services" })'>
Services/Manage/About
</a>
</li>
<li>
<a href='@Url.Page("/About", new { area = "Products" })'>
Products/About
</a>
</li>
</ul>
Il download di esempio include una visualizzazione parziale che contiene i collegamenti precedenti e gli stessi collegamenti senza specificare l'area. La visualizzazione parziale viene referenziata nel file di layout, in modo che ogni pagina nell'app mostri i collegamenti generati. I collegamenti generati senza specificare l'area sono validi solo in caso di riferimento da una pagina nella stessa area.
Quando l'area non è specificata, il routing dipende dai valori di ambiente. I valori di route correnti della richiesta corrente sono considerati valori di ambiente per la generazione del collegamento. In molti casi per l'app di esempio, l'uso dei valori di ambiente genera collegamenti non corretti. Si considerino, ad esempio, i collegamenti generati dal codice seguente:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Per il codice precedente:
<a asp-page="/Manage/About">
è corretto solo quando l'ultima richiesta riguarda una pagina nell'area Services
. Ad esempio, /Services/Manage/
, /Services/Manage/Index
o /Services/Manage/About
.<a asp-page="/About">
è corretto solo quando l'ultima richiesta riguarda una pagina in /Home
.È possibile aggiungere un _ViewImports.cshtml
file a ogni cartella Pagine dell'area per importare lo spazio dei nomi e gli helper tag in ogni Razor pagina della cartella.
Si consideri l'area Servizi del codice di esempio, che non contiene un _ViewImports.cshtml
file. Il markup seguente mostra la pagina /Services/Manage/AboutRazor :
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
ViewData["Title"] = "Srv Mng About";
}
<a asp-area="Products" asp-page="/Index">
Products/Index
</a>
Nel markup precedente:
@model RPareas.Areas.Services.Pages.Manage.AboutModel
).@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Nel download di esempio l'area Prodotti contiene il file seguente _ViewImports.cshtml
:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Il markup seguente mostra la pagina /Products/AboutRazor :
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
Nel file precedente lo spazio dei nomi e @addTagHelper
la direttiva viene importato nel file dal Areas/Products/Pages/_ViewImports.cshtml
file .
Per altre informazioni, vedere Gestione dell'ambito dell'helper tag e Importazione delle direttive condivise.
Per condividere un layout comune per l'intera app, spostarlo _ViewStart.cshtml
nella cartella radice dell'applicazione.
Tutti i file *.cshtml e i file all'interno della directory wwwroot vengono pubblicati nell'output quando <Project Sdk="Microsoft.NET.Sdk.Web">
è incluso nel file *.csproj.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere > con scaffolding, quindi selezionare Area MVC.
Le aree sono una funzionalità di ASP.NET che consente di organizzare le funzioni correlate in un gruppo come spazio dei nomi separato (per il routing) e struttura di cartelle (per le visualizzazioni). L'uso di aree crea una gerarchia per lo scopo del routing aggiungendo un altro parametro di route, area
, a controller
e action
o una Razor pagina page
.
Le aree consentono di partizionare un'app Web core ASP.NET in gruppi funzionali più piccoli, ognuno con un proprio set di Razor pagine, controller, visualizzazioni e modelli. Un'area è in effetti una struttura all'interno di un'app. In un progetto Web ASP.NET Core i componenti logici come pagine, modello, controller e visualizzazione si trovano in cartelle diverse. Il runtime di ASP.NET Core crea una relazione tra questi componenti usando convenzioni di denominazione. Per un'app di grandi dimensioni può risultare utile suddividere l'app in aree di funzionalità di alto livello distinte. È il caso, ad esempio, di un'app di e-commerce con più business unit, ad esempio per il completamento della transazione, la fatturazione e la ricerca. Ognuna di queste unità ha una propria area per contenere visualizzazioni, controller, Razor pagine e modelli.
In un progetto è consigliabile usare le aree quando:
Visualizzare o scaricare il codice di esempio (procedura per il download). Il download di esempio fornisce un'app di base per testare le aree.
Se si usano Razor pagine, vedere Aree con Razor pagine in questo documento.
Una tipica app Web ASP.NET Core che usa aree, controller e visualizzazioni contiene quanto segue:
Controller con l'attributo [Area]
per associare il controller all'area:
[Area("Products")]
public class ManageController : Controller
{
La route di area aggiunta all'avvio:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "MyArea",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Si consideri un'applicazione che ha due gruppi logici, Prodotti e Servizi. Usando le aree, la struttura delle cartelle sarebbe simile alla seguente:
Anche se il layout precedente è tipico quando si usano le aree, per usare questa struttura di cartelle sono necessari solo i file delle visualizzazioni. L'individuazione delle visualizzazioni cercherà un file di visualizzazione area corrispondente in quest'ordine:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
/Pages/Shared/<Action-Name>.cshtml
I controller di area sono designati con l'attributo [Area] :
using Microsoft.AspNetCore.Mvc;
namespace MVCareas.Areas.Products.Controllers
{
[Area("Products")]
public class ManageController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult About()
{
return View();
}
}
}
Le route di area usano in genere il routing convenzionale anziché il routing con attributi. Il routing convenzionale dipende dall'ordinamento. In generale, le route con aree devono essere posizionate prima delle altre nella tabella di route poiché sono più specifiche rispetto alle route senza un'area.
{area:...}
può essere usato come token nei modelli di route se lo spazio URL è uniforme in tutte le aree:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "MyArea",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Nel codice precedente, exists
applica il vincolo che la route deve corrispondere a un'area. L'uso di {area:...}
è il meccanismo meno complesso per l'aggiunta del routing alle aree.
Il codice seguente usa MapAreaRoute per creare due route di area denominate:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapAreaRoute(
name: "MyAreaProducts",
areaName:"Products",
template: "Products/{controller=Home}/{action=Index}/{id?}");
routes.MapAreaRoute(
name: "MyAreaServices",
areaName: "Services",
template: "Services/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Quando si usa MapAreaRoute
con ASP.NET Core 2.2, vedere questo problema su GitHub.
Per altre informazioni, vedere Aree.
Il codice seguente dal download di esempio mostra la generazione di collegamenti con l'area specificata:
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-controller="Home" asp-action="About">
Products/Home/About
</a>
</li>
<li>
<a asp-area="Services" asp-controller="Home" asp-action="About">
Services About
</a>
</li>
<li>
<a asp-area="" asp-controller="Home" asp-action="About">
/Home/About
</a>
</li>
</ul>
<li>Html.ActionLink generated links</li>
<ul>
<li>
@Html.ActionLink("Product/Manage/About", "About", "Manage",
new { area = "Products" })
</li>
</ul>
<li>Url.Action generated links</li>
<ul>
<li>
<a href='@Url.Action("About", "Manage", new { area = "Products" })'>
Products/Manage/About
</a>
</li>
</ul>
I collegamenti generati con il codice precedente sono validi ovunque nell'app.
Il download di esempio include una visualizzazione parziale che contiene i collegamenti precedenti e gli stessi collegamenti senza specificare l'area. La visualizzazione parziale viene referenziata nel file di layout, in modo che ogni pagina nell'app mostri i collegamenti generati. I collegamenti generati senza specificare l'area sono validi solo quando sono referenziati da una pagina nella stessa area e controller.
Quando l'area o il controller non sono specificati, il routing dipende dai valori di ambiente. I valori di route correnti della richiesta corrente sono considerati valori di ambiente per la generazione del collegamento. In molti casi per l'app di esempio, l'uso dei valori di ambiente genera collegamenti non corretti.
Per altre informazioni, vedere Routing ad azioni del controller.
Per condividere un layout comune per l'intera app, spostarlo _ViewStart.cshtml
nella cartella radice dell'applicazione.
Nella sua posizione /Views/_ViewImports.cshtml
standard, non si applica alle aree. Per usare gli helper tag comuni Se si vuole lo stesso comportamento in tutte le visualizzazioni, passare /Views/_ViewImports.cshtml
alla radice dell'applicazione.
Il codice seguente modifica la cartella dell'area predefinita da "Areas"
a "MyAreas"
:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
services.AddMvc();
}
Le aree con Razor Pagine richiedono una Areas/<area name>/Pages
cartella nella radice dell'app. La struttura di cartelle seguente viene usata con l'app di esempio:
Il codice seguente dal download di esempio mostra la generazione di collegamenti con l'area specificata (ad esempio, asp-area="Products"
):
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-page="/About">
Products/About
</a>
</li>
<li>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-area="" asp-page="/About">
/About
</a>
</li>
</ul>
<li>Url.Page generated links</li>
<ul>
<li>
<a href='@Url.Page("/Manage/About", new { area = "Services" })'>
Services/Manage/About
</a>
</li>
<li>
<a href='@Url.Page("/About", new { area = "Products" })'>
Products/About
</a>
</li>
</ul>
I collegamenti generati con il codice precedente sono validi ovunque nell'app.
Il download di esempio include una visualizzazione parziale che contiene i collegamenti precedenti e gli stessi collegamenti senza specificare l'area. La visualizzazione parziale viene referenziata nel file di layout, in modo che ogni pagina nell'app mostri i collegamenti generati. I collegamenti generati senza specificare l'area sono validi solo in caso di riferimento da una pagina nella stessa area.
Quando l'area non è specificata, il routing dipende dai valori di ambiente. I valori di route correnti della richiesta corrente sono considerati valori di ambiente per la generazione del collegamento. In molti casi per l'app di esempio, l'uso dei valori di ambiente genera collegamenti non corretti. Si considerino, ad esempio, i collegamenti generati dal codice seguente:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Per il codice precedente:
<a asp-page="/Manage/About">
è corretto solo quando l'ultima richiesta riguarda una pagina nell'area Services
. Ad esempio, /Services/Manage/
, /Services/Manage/Index
o /Services/Manage/About
.<a asp-page="/About">
è corretto solo quando l'ultima richiesta riguarda una pagina in /Home
.È possibile aggiungere un _ViewImports.cshtml
file a ogni cartella Pagine dell'area per importare lo spazio dei nomi e gli helper tag in ogni Razor pagina della cartella.
Si consideri l'area Servizi del codice di esempio, che non contiene un _ViewImports.cshtml
file. Il markup seguente mostra la pagina /Services/Manage/AboutRazor :
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
ViewData["Title"] = "Srv Mng About";
}
<h2>/Services/Manage/About</h2>
<a asp-area="Products" asp-page="/Index">
Products/Index
</a>
Nel markup precedente:
@model RPareas.Areas.Services.Pages.Manage.AboutModel
).@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Nel download di esempio l'area Prodotti contiene il file seguente _ViewImports.cshtml
:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Il markup seguente mostra la pagina /Products/AboutRazor :
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
<h2>Products/About</h2>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
Nel file precedente lo spazio dei nomi e @addTagHelper
la direttiva viene importato nel file dal Areas/Products/Pages/_ViewImports.cshtml
file .
Per altre informazioni, vedere Gestione dell'ambito dell'helper tag e Importazione delle direttive condivise.
Per condividere un layout comune per l'intera app, spostarlo _ViewStart.cshtml
nella cartella radice dell'applicazione.
Tutti i file *.cshtml e i file all'interno della directory wwwroot vengono pubblicati nell'output quando <Project Sdk="Microsoft.NET.Sdk.Web">
è incluso nel file *.csproj.
Feedback su ASP.NET Core
ASP.NET Core è un progetto di open source. Selezionare un collegamento per fornire feedback:
Formazione
Modulo
Creare un progetto .NET Aspire - Training
Informazioni su come creare applicazioni native del cloud da zero o aggiungere orchestrazione a un'app esistente usando lo stack .NET Aspire in .NET 8.