Skapa återanvändbart användargränssnitt med hjälp av Razor-klassbiblioteksprojektet i ASP.NET Core
Razor vyer, sidor, styrenheter, sidmodeller, Razor komponenter, Visa komponenteroch datamodeller kan byggas in i ett Razor klassbibliotek (RCL). RCL kan paketeras och återanvändas. Program kan inkludera RCL och åsidosätta de vyer och sidor som den innehåller. När en vy, partiell vy eller Razor-sida finns i både webbappen och RCL har Razor-markeringen (.cshtml
-filen) i webbappen företräde.
Information om hur du integrerar npm och webpack i byggprocessen för en RCL finns i Build client web assets for your Razor Class Library.
Skapa ett klassbibliotek som innehåller Razor användargränssnitt
- I Visual Studio väljer du Skapa ett nytt projekt.
- Välj Razor klassbibliotek>Nästa.
- Ge biblioteket namnet (till exempel "RazorClassLib"), >Skapa. Om du vill undvika en filnamnskollision med det genererade visningsbiblioteket kontrollerar du att biblioteksnamnet inte slutar
.Views
. - Välj Supportsidor och vyer om du behöver biblioteket för att innehålla sidor och/eller vyer. Som standard stöds endast Razor komponenter. Välj Skapa.
Mallen Razor klassbibliotek används som standard för Razor-komponentutveckling. Alternativet Supportsidor och vyer ger stöd för sidor och vyer. Mer information om RCL-stöd i Blazorfinns i Använd ASP.NET Core Razor-komponenter från ett Razor-klassbibliotek (RCL).
Lägg till Razor filer i RCL:en.
ASP.NET Core-mallarna förutsätter att RCL-innehållet finns i mappen Areas
. Se layouten RCL Pages nedan för att skapa en RCL som exponerar innehåll i ~/Pages
i stället för ~/Areas/Pages
.
Referens-RCL-innehåll
RCL kan refereras till av:
- NuGet-paket. Se Skapa NuGet-paket och dotnet lägg till paket och Skapa och publicera ett NuGet-paket.
-
{ProjectName}.csproj
. Se till dotnet-add reference.
Åsidosätt vyer, delvyer och sidor
När en vy, partiell vy eller Razor sida finns i både webbappen och RCL har Razor-markup (.cshtml
-fil) i webbappen företräde. Du kan till exempel lägga till WebApp1/Areas/MyFeature/Pages/Page1.cshtml
i WebApp1, och Page1 i WebApp1 kommer att ha företräde framför Page1 i RCL.
I exempelnedladdningen byter du namn på WebApp1/Areas/MyFeature2
till WebApp1/Areas/MyFeature
för att testa prioritet.
Kopiera RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
partiell vy till WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Uppdatera markering för att ange den nya platsen. Skapa och kör appen för att verifiera att appens version av den delvisa komponenten används.
Om RCL använder Razor Pages aktiverar du tjänsterna och slutpunkterna för Razor Pages i värdappen:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
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: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Layout för RCL-sidor
Om du vill referera till RCL-innehåll som om det är en del av webbappens Pages
mapp skapar du RCL-projektet med följande filstruktur:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Anta att RazorUIClassLib/Pages/Shared
innehåller två partiella filer: _Header.cshtml
och _Footer.cshtml
. Taggarna <partial>
kan läggas till i _Layout.cshtml
fil:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Lägg till filen _ViewStart.cshtml
i RCL-projektets Pages
-mapp för att använda _Layout.cshtml
-filen från värdwebbappen:
@{
Layout = "_Layout";
}
Skapa en RCL med statiska tillgångar
En RCL kan kräva kompletterande statiska resurser som kan refereras av antingen RCL eller den användande appen av RCL. ASP.NET Core gör det möjligt att skapa RCL:er som innehåller statiska tillgångar som är tillgängliga för en förbrukande app.
Om du vill inkludera tillhörande tillgångar som en del av en RCL skapar du en wwwroot
mapp i klassbiblioteket och inkluderar alla nödvändiga filer i mappen.
När du packar en RCL inkluderas alla tillhörande tillgångar i mappen wwwroot
automatiskt i paketet.
Använd kommandot dotnet pack
i stället för NuGet.exe version nuget pack
.
Lägga till klientwebbtillgångar i byggprocessen
Integreringen av kundens webbresurser i byggpipelinen är inte enkel. För mer information, se Bygg klientwebbtillgångar för ditt Razor Klassbibliotek.
Exkludera statiska tillgångar
Om du vill exkludera statiska tillgångar lägger du till önskad exkluderingssökväg till $(DefaultItemExcludes)
egenskapsgrupp i projektfilen. Avgränsa poster med semikolon (;
).
I följande exempel betraktas inte lib.css
-formatmallen i mappen wwwroot
som en statisk tillgång och ingår inte i den publicerade RCL:en:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
Typescript-integrering
Så här inkluderar du TypeScript-filer i en RCL:
Referera till
Microsoft.TypeScript.MSBuild
NuGet-paketet i projektet.Anteckning
Mer information om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket på Arbetsflöde för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Placera TypeScript-filerna (
.ts
) utanför mappenwwwroot
. Placera till exempel filerna i enClient
mapp.Lägg till följande markering i projektfilen:
- Konfigurera TypeScript-kompileringsutdata för mappen
wwwroot
med egenskapenTypescriptOutDir
. - Inkludera TypeScript-målet som ett beroende av det
PrepareForBuildDependsOn
målet. - Ta bort utdata i
wwwroot folder
.
- Konfigurera TypeScript-kompileringsutdata för mappen
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
// Markup removed for brevity.
<TypescriptOutDir>wwwroot</TypescriptOutDir>
<PrepareForBuildDependsOn>
CompileTypeScriptWithTSConfig;
GetTypeScriptOutputForPublishing;$(PrepareForBuildDependsOn)
</PrepareForBuildDependsOn>
</PropertyGroup>
<ItemGroup>
<Content Remove="wwwroot\{path-to-typescript-outputs}" />
</ItemGroup>
</Project>
Använda innehåll från en refererad RCL
Filerna som ingår i mappen wwwroot
för RCL exponeras för antingen RCL eller den förbrukande appen under prefixet _content/{PACKAGE ID}/
. Ett bibliotek med sammansättningsnamnet Razor.Class.Lib
och utan en <PackageId>
som anges i projektfilen resulterar till exempel i en sökväg till statiskt innehåll på _content/Razor.Class.Lib/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t enligt beskrivningen i projektfilen för {PACKAGE ID}
.
Den förbrukande appen refererar till statiska tillgångar som tillhandahålls av biblioteket med <script>
, <style>
, <img>
och andra HTML-taggar. Den förbrukande appen måste ha stöd för statiska filer aktiverat i:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
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: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
När du kör den konsumerande appen från kompilatutdata (dotnet run
) aktiveras statiska webbtillgångar som standardinställning i utvecklingsläge. Anropa UseStaticWebAssets på värdbyggaren i Program.cs
för att stöda resurser i andra miljöer vid körning från byggutdata.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseWebRoot("wwwroot");
builder.WebHost.UseStaticWebAssets();
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Det är inte nödvändigt att ringa UseStaticWebAssets
vid körning av en app från publicerade resultat (dotnet publish
).
Utvecklingsflöde för flera projekt
När den förbrukande appen körs:
- Tillgångarna i RCL finns kvar i sina ursprungliga mappar. Tillgångarna flyttas inte till den förbrukande appen.
- Alla ändringar i RCL:s
wwwroot
-mapp återspeglas i den förbrukande appen efter att RCL:en har återskapats och utan att den förbrukande appen återskapas.
När RCL skapas skapas ett manifest som beskriver de statiska webbtillgångsplatserna. Den användande appen läser manifestet vid körning för att använda resurser från refererade projekt och paket. När en ny tillgång läggs till i en RCL måste RCL återskapas för att uppdatera manifestet innan en förbrukande app kan komma åt den nya tillgången.
Publicera
När appen publiceras kopieras de tillhörande tillgångarna från alla refererade projekt och paket till mappen wwwroot
för den publicerade appen under _content/{PACKAGE ID}/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t som anges i projektfilen för {PACKAGE ID}
när du undersöker mappen wwwroot
för de publicerade tillgångarna.
Ytterligare resurser
Razor vyer, sidor, styrenheter, sidmodeller, Razor komponenter, Visa komponenteroch datamodeller kan byggas in i ett Razor klassbibliotek (RCL). RCL kan paketeras och återanvändas. Program kan inkludera RCL och åsidosätta de vyer och sidor som den innehåller. När en vy, partiell vy eller Razor sida finns i både webbappen och RCL har Razor-markup (.cshtml
-fil) i webbappen företräde.
Information om hur du integrerar npm och webpack i byggprocessen för ett Razor-klassbibliotek finns i Build client web assets for your Razor Class Library.
Skapa ett klassbibliotek som innehåller Razor användargränssnitt
- I Visual Studio väljer du Skapa ett nytt projekt.
- Välj Razor Klassbibliotek>Nästa.
- Ge biblioteket namnet (till exempel "RazorClassLib"), >Skapa. Om du vill undvika en filnamnskollision med det genererade visningsbiblioteket kontrollerar du att biblioteksnamnet inte slutar
.Views
. - Välj supportsidor och vyer om du behöver stöd för vyer. Som standardinställning stöds endast Razor-sidor. Välj Skapa.
Mallen Razor klassbibliotek (RCL)-mallen standardinställning är Razor komponentutveckling. Alternativet Supportsidor och vyer stöder sidor och vyer.
Lägg till Razor filer i RCL:en.
ASP.NET Core-mallarna förutsätter att RCL-innehållet finns i mappen Areas
. Se layouten RCL Pages nedan för att skapa en RCL som exponerar innehåll i ~/Pages
i stället för ~/Areas/Pages
.
Referens-RCL-innehåll
RCL kan refereras till av:
- NuGet-paket. Se Skapa NuGet-paket och dotnet lägg till paket och Skapa och publicera ett NuGet-paket.
-
{ProjectName}.csproj
. Se dotnet-add reference.
Åsidosätt vyer, delvyer och sidor
När en vy, delvy eller Razor-sida finns i både webbappen och RCL har Razor-markeringen (en.cshtml
-fil) i webbappen företräde. Du kan till exempel lägga till WebApp1/Areas/MyFeature/Pages/Page1.cshtml
i WebApp1, och Page1 i WebApp1 har företräde framför Page1 i RCL.
I exempelnedladdningen byter du namn på WebApp1/Areas/MyFeature2
till WebApp1/Areas/MyFeature
för att testa prioritet.
Kopiera RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
partiell vy till WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Uppdatera markering för att ange den nya platsen. Bygg och kör appen för att verifiera att det är appens version av "partial" som används.
Om RCL använder Razor Pages aktiverar du tjänsterna och slutpunkterna för Razor Pages i värdappen:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
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: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Layout för RCL-sidor
Om du vill referera till RCL-innehåll som om det är en del av webbappens Pages
mapp skapar du RCL-projektet med följande filstruktur:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Anta att RazorUIClassLib/Pages/Shared
innehåller två partiella filer: _Header.cshtml
och _Footer.cshtml
. Taggarna <partial>
kan läggas till i _Layout.cshtml
fil:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Lägg till filen _ViewStart.cshtml
i RCL-projektets Pages
-mapp för att använda _Layout.cshtml
-filen från värdwebbappen:
@{
Layout = "_Layout";
}
Skapa en RCL med statiska tillgångar
En RCL kan kräva medföljande statiska tillgångar som kan refereras av antingen RCL eller den app som använder RCL. ASP.NET Core gör det möjligt att skapa RCL:er som innehåller statiska tillgångar som är tillgängliga för en förbrukande app.
Om du vill inkludera tillhörande tillgångar som en del av en RCL skapar du en wwwroot
mapp i klassbiblioteket och inkluderar alla nödvändiga filer i mappen.
När du packar en RCL inkluderas alla tillhörande tillgångar i mappen wwwroot
automatiskt i paketet.
Använd kommandot dotnet pack
i stället för NuGet.exe version nuget pack
.
Exkludera statiska tillgångar
Om du vill exkludera statiska tillgångar lägger du till önskad exkluderingssökväg till $(DefaultItemExcludes)
egenskapsgrupp i projektfilen. Avgränsa poster med ett semikolon (;
).
I följande exempel betraktas inte lib.css
-formatmallen i mappen wwwroot
som en statisk tillgång och ingår inte i den publicerade RCL:en:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
TypeScript-integrering
Så här inkluderar du TypeScript-filer i en RCL:
Referera till
Microsoft.TypeScript.MSBuild
NuGet-paketet i projektet.Not
Mer information om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket på Arbetsflöde för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Placera TypeScript-filerna (
.ts
) utanför mappenwwwroot
. Placera till exempel filerna i enClient
mapp.Konfigurera TypeScript-kompileringsutdata för mappen
wwwroot
. Ange egenskapenTypescriptOutDir
inuti enPropertyGroup
i projektfilen:<TypescriptOutDir>wwwroot</TypescriptOutDir>
Inkludera TypeScript-målet som ett beroende av
PrepareForBuildDependsOn
-målet genom att lägga till följande mål i enPropertyGroup
i projektfilen.<PrepareForBuildDependsOn> CompileTypeScript; GetTypeScriptOutputForPublishing;$(PrepareForBuildDependsOn) </PrepareForBuildDependsOn>
Använda innehåll från en refererad RCL
Filerna som ingår i mappen wwwroot
för RCL exponeras för antingen RCL eller den förbrukande appen under prefixet _content/{PACKAGE ID}/
. Ett bibliotek med sammansättningsnamnet Razor.Class.Lib
och utan en <PackageId>
som anges i projektfilen resulterar till exempel i en sökväg till statiskt innehåll på _content/Razor.Class.Lib/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t enligt beskrivningen i projektfilen för {PACKAGE ID}
.
Den förbrukande appen refererar till statiska tillgångar som tillhandahålls av biblioteket med <script>
, <style>
, <img>
och andra HTML-taggar. Den förbrukande appen måste ha stöd för statiska filer aktiverat i:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
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: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
När du kör den konsumerande appen från byggutdata (dotnet run
) aktiveras statiska webbtillgångar som standardläge i utvecklingsmiljön. Anropa UseStaticWebAssets på värdverktyget i Program.cs
för att stödja tillgångar i andra miljöer när du kör från byggutdata:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets();
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Obs! .NET 6 kräver bara anrop builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets
. För mer information, se denna GitHub-fråga.
Det är inte nödvändigt att anropa UseStaticWebAssets
när du kör en app från den publicerade utmatningen (dotnet publish
).
Utvecklingsflöde för flera projekt
När den förbrukande appen körs:
- Tillgångarna i RCL finns kvar i sina ursprungliga mappar. Tillgångarna flyttas inte till den förbrukande appen.
- Alla ändringar i RCL:s
wwwroot
-mapp återspeglas i den konsumerande appen efter att RCL:en har återskapats, utan att återskapa den konsumerande appen.
När RCL skapas skapas ett manifest som beskriver de statiska webbtillgångsplatserna. Den konsumerande appen läser manifestet vid körning för att använda resurserna från refererade projekt och paket. När en ny tillgång läggs till i en RCL måste RCL återskapas för att uppdatera manifestet innan en förbrukande app kan komma åt den nya tillgången.
Publicera
När appen publiceras kopieras de tillhörande tillgångarna från alla refererade projekt och paket till mappen wwwroot
för den publicerade appen under _content/{PACKAGE ID}/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t som anges i projektfilen för {PACKAGE ID}
när du undersöker mappen wwwroot
för de publicerade tillgångarna.
Ytterligare resurser
Razor vyer, sidor, styrenheter, sidmodeller, Razor komponenter, vykomponenteroch datamodeller kan byggas in i ett Razor klassbibliotek (RCL). RCL kan paketeras och återanvändas. Program kan inkludera RCL och åsidosätta de vyer och sidor som den innehåller. När en vy, partiell vy eller Razor sida finns i både webbappen och RCL har Razor-markup (.cshtml
-fil) i webbappen prioritet.
Visa eller ladda ned exempelkod (hur du laddar ned)
Skapa ett klassbibliotek som innehåller Razor användargränssnitt
- I Visual Studio väljer du Skapa ett nytt projekt.
- Välj Razor klassbibliotek>Nästa.
- Ge biblioteket namnet (till exempel "RazorClassLib"), >Skapa>Nästa. Om du vill undvika en filnamnskollision med det genererade visningsbiblioteket kontrollerar du att biblioteksnamnet inte slutar
.Views
. - Välj Målramverk. Kontrollera ☑ supportsidor och vyer för att stödja vyer. Som standard stöds endast Razor komponenter. Välj Skapa.
Mallen Razor klassbibliotek (RCL) är som standard för utveckling av Razor-komponenter. Alternativet Support-sidor och vyer ger stöd för sidor och vyer.
Lägg till Razor filer i RCL:en.
ASP.NET Core-mallarna förutsätter att RCL-innehållet finns i mappen Areas
. Se layouten RCL Pages för att skapa en RCL som exponerar innehåll i ~/Pages
i stället för ~/Areas/Pages
.
Referens-RCL-innehåll
RCL kan refereras till av:
- NuGet-paket. Se Skapa NuGet-paket och dotnet lägg till paket och Skapa och publicera ett NuGet-paket.
-
{ProjectName}.csproj
. Se dotnet-add reference.
Åsidosätt vyer, delvyer och sidor
När en vy, en partiell vy eller en Razor-sida finns i både webbappen och RCL, har Razor-markeringen (.cshtml
-filen) i webbappen företräde. Till exempel, lägg till WebApp1/Areas/MyFeature/Pages/Page1.cshtml
i WebApp1, så att Sida1 i WebApp1 får företräde över Sida1 i RCL.
I exempelnedladdningen byter du namn på WebApp1/Areas/MyFeature2
till WebApp1/Areas/MyFeature
för att testa prioritet.
Kopiera RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
partiell vy till WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Uppdatera markering för att ange den nya platsen. Skapa och kör appen för att verifiera att den version av appen som använder partialen används.
Layout för RCL-sidor
Om du vill referera till RCL-innehåll som om det är en del av webbappens Pages
mapp skapar du RCL-projektet med följande filstruktur:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Anta att RazorUIClassLib/Pages/Shared
innehåller två partiella filer: _Header.cshtml
och _Footer.cshtml
. Taggarna <partial>
kan läggas till i _Layout.cshtml
fil:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Lägg till filen _ViewStart.cshtml
i RCL-projektets Pages
-mapp för att använda _Layout.cshtml
-filen från värdwebbappen:
@{
Layout = "_Layout";
}
Skapa en RCL med statiska tillgångar
En RCL kan kräva kompletterande statiska tillgångar som kan refereras av RCL:n eller den konsumerande appen av RCL:n. ASP.NET Core gör det möjligt att skapa RCL:er som innehåller statiska tillgångar som är tillgängliga för en förbrukande app.
Om du vill inkludera tillhörande tillgångar som en del av en RCL skapar du en wwwroot
mapp i klassbiblioteket och inkluderar alla nödvändiga filer i mappen.
När du packar en RCL inkluderas alla tillhörande tillgångar i mappen wwwroot
automatiskt i paketet.
Använd kommandot dotnet pack
i stället för NuGet.exe version nuget pack
.
Exkludera statiska tillgångar
Om du vill exkludera statiska tillgångar lägger du till önskad exkluderingssökväg till $(DefaultItemExcludes)
egenskapsgrupp i projektfilen. Avgränsa poster med semikolon (;
).
I följande exempel betraktas inte lib.css
-formatmallen i mappen wwwroot
som en statisk tillgång och ingår inte i den publicerade RCL:en:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
Typescript-integrering
Så här inkluderar du TypeScript-filer i en RCL:
Referera till
Microsoft.TypeScript.MSBuild
NuGet-paketet i projektet.Anteckning
Mer information om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket på Arbetsflöde för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Placera TypeScript-filerna (
.ts
) utanför mappenwwwroot
. Placera till exempel filerna i enClient
mapp.Konfigurera TypeScript-kompileringsutdata för mappen
wwwroot
. Ange egenskapenTypescriptOutDir
inom enPropertyGroup
i projektfilen.<TypescriptOutDir>wwwroot</TypescriptOutDir>
Inkludera TypeScript-målet som ett beroende av
ResolveCurrentProjectStaticWebAssets
-målet genom att lägga till följande mål inom ettPropertyGroup
-element i projektfilen.<ResolveCurrentProjectStaticWebAssetsInputsDependsOn> CompileTypeScript; $(ResolveCurrentProjectStaticWebAssetsInputs) </ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
Konsumera innehåll från en refererad RCL
Filerna som ingår i mappen wwwroot
för RCL exponeras för antingen RCL eller den förbrukande appen under prefixet _content/{PACKAGE ID}/
. Ett bibliotek med sammansättningsnamnet Razor.Class.Lib
och utan en <PackageId>
som anges i projektfilen resulterar till exempel i en sökväg till statiskt innehåll på _content/Razor.Class.Lib/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t enligt beskrivningen i projektfilen för {PACKAGE ID}
.
Den förbrukande appen refererar till statiska tillgångar som tillhandahålls av biblioteket med <script>
, <style>
, <img>
och andra HTML-taggar. Den förbrukande appen måste ha stöd för statiska filer aktiverade i Startup.Configure
:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseStaticFiles();
...
}
När du kör den användande appen från byggutdata (dotnet run
) aktiveras statiska webbtillgångar per standard i utvecklingsmiljön. Anropa UseStaticWebAssets
på värdbyggaren i Program.cs
för att stödja resurser i andra miljöer när du kör från byggets utdata.
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStaticWebAssets();
webBuilder.UseStartup<Startup>();
});
}
Anropa UseStaticWebAssets
krävs inte när du kör en app från publicerad utgång (dotnet publish
).
Utvecklingsflöde för flera projekt
När den konsumerande appen körs:
- Tillgångarna i RCL finns kvar i sina ursprungliga mappar. Tillgångarna flyttas inte till den förbrukande appen.
- Alla ändringar i RCL:s
wwwroot
-mapp återspeglas i den förbrukande appen efter att RCL:en har återskapats och utan att den förbrukande appen återskapas.
När RCL skapas skapas ett manifest som beskriver de statiska webbtillgångsplatserna. Den konsumerande appen läser manifestet under körning för att använda resurserna från refererade projekt och paket. När en ny tillgång läggs till i en RCL måste RCL återskapas för att uppdatera manifestet innan en förbrukande app kan komma åt den nya tillgången.
Publicera
När appen publiceras kopieras de tillhörande tillgångarna från alla refererade projekt och paket till mappen wwwroot
för den publicerade appen under _content/{PACKAGE ID}/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t som anges i projektfilen för {PACKAGE ID}
när du undersöker mappen wwwroot
för de publicerade tillgångarna.
Ytterligare resurser
Razor vyer, sidor, kontroller, sidmodeller, Razor komponenter, vykomponenteroch datamodeller kan byggas in i ett Razor klassbibliotek (RCL). RCL kan paketeras och återanvändas. Program kan inkludera RCL och åsidosätta de vyer och sidor som den innehåller. När en vy, partiell vy eller Razor-sida finns i både webbappen och RCL tar Razor-uppmärkning (.cshtml
-fil) i webbappen företräde.
Visa eller ladda ned exempelkod (hur du laddar ned)
Skapa ett klassbibliotek som innehåller Razor användargränssnitt
- Välj New>Projectpå menyn i Visual Studio File .
- Välj ASP.NET Core Web Application.
- Ge biblioteket namnet (till exempel "RazorClassLib") >OK. Om du vill undvika en filnamnskollision med det genererade visningsbiblioteket kontrollerar du att biblioteksnamnet inte slutar
.Views
. - Kontrollera att ASP.NET Core 2.1 eller senare har valts.
- Välj Razor klassbibliotek>OK.
En RCL har följande projektfil:
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Lägg till Razor filer i RCL:en.
ASP.NET Core-mallarna förutsätter att RCL-innehållet finns i mappen Areas
. Se layouten RCL Pages för att skapa en RCL som exponerar innehåll i ~/Pages
i stället för ~/Areas/Pages
.
Referens-RCL-innehåll
RCL kan refereras till av:
- NuGet-paket. Se Skapa NuGet-paket och dotnet lägg till paket och Skapa och publicera ett NuGet-paket.
-
{ProjectName}.csproj
. Se kommandot `dotnet-add reference`.
Genomgång: Skapa ett RCL-projekt och använda från ett Razor Pages-projekt
Du kan ladda ned slutföra projektet och testa det i stället för att skapa det. Exempelnedladdningen innehåller ytterligare kod och länkar som gör projektet enkelt att testa. Du kan lämna feedback i det här GitHub-problemet med dina kommentarer om nedladdningsexempel jämfört med stegvisa instruktioner.
Testa nedladdningsappen
Om du inte har laddat ned den färdiga appen och hellre vill skapa genomgångsprojektet går du vidare till nästa avsnitt.
Öppna filen .sln
i Visual Studio. Kör appen.
Följ anvisningarna i Test WebApp1
Skapa en RCL
I det här avsnittet skapas en RCL. Razor-filer läggs till i RCL.
Skapa RCL-projektet:
- Välj New>Projectpå menyn i Visual Studio File .
- Välj ASP.NET Core Web Application.
- Ge appen namnet RazorUIClassLib>OK.
- Kontrollera att ASP.NET Core 2.1 eller senare har valts.
- Välj Razor Klassbibliotek>OK.
- Lägg till en Razor partiell vyfil med namnet
RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
.
Lägga till Razor filer och mappar i projektet
Ersätt markeringen i
RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
med följande kod:<h3>_Message.cshtml partial view.</h3> <p>RazorUIClassLib\Areas\MyFeature\Pages\Shared\_Message.cshtml</p>
Ersätt markeringen i
RazorUIClassLib/Areas/MyFeature/Pages/Page1.cshtml
med följande kod:@page @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <h2>Hello from a Razor UI class library!</h2> <p> From RazorUIClassLib\Areas\MyFeature\Pages\Page1.cshtml</p> <partial name="_Message" />
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
måste användas för att använda den partiella vyn (<partial name="_Message" />
). I stället för att inkludera@addTagHelper
-direktivet kan du lägga till en_ViewImports.cshtml
fil. Till exempel:dotnet new viewimports -o RazorUIClassLib/Areas/MyFeature/Pages
Mer information om
_ViewImports.cshtml
finns i Importering av delade direktivSkapa klassbiblioteket för att kontrollera att det inte finns några kompilatorfel:
dotnet build RazorUIClassLib
Byggutdata innehåller RazorUIClassLib.dll
och RazorUIClassLib.Views.dll
.
RazorUIClassLib.Views.dll
innehåller det kompilerade Razor innehållet.
Använda Razor UI-biblioteket från ett Razor Pages-projekt
Skapa webbappen Razor Pages:
Från Solution Explorerhögerklickar du på lösningen >Lägg till>Nytt projekt.
Välj ASP.NET Core Web Application.
Ge appen namnet WebApp1.
Kontrollera att ASP.NET Core 2.1 eller senare har valts.
Välj webbprogram>OK.
Från Solution Explorerhögerklickar du på WebApp1 och väljer Ange som startprojekt.
Från Solution Explorerhögerklickar du på WebApp1 och väljer Byggberoenden>Projektberoenden.
Kontrollera RazorUIClassLib som ett beroende av WebApp1.
Från Solution Explorerhögerklickar du på WebApp1 och väljer Lägg till>Referens.
I dialogrutan Reference Manager kontrollerar du RazorUIClassLib>OK.
Kör appen.
Testa WebApp1
Bläddra till /MyFeature/Page1
för att kontrollera att Razor UI-klassbiblioteket används.
Ta över vyer, delvisa vyer och sidor
När en vy, partiell-vy eller Razor-sida finns både i webbappen och RCL, har Razor-markup (.cshtml
-fil) inom webbappen företräde. Till exempel, lägg till WebApp1/Areas/MyFeature/Pages/Page1.cshtml
i WebApp1, och Sida1 i WebApp1 kommer att ha företräde framför Sida1 i RCL.
I exempelnedladdningen byter du namn på WebApp1/Areas/MyFeature2
till WebApp1/Areas/MyFeature
för att testa prioritet.
Kopiera RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
partiell vy till WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Uppdatera markering för att ange den nya platsen. Skapa och kör appen för att verifiera att appens version av det partiella används.
Layout för RCL-sidor
Om du vill referera till RCL-innehåll som om det är en del av webbappens Pages
mapp skapar du RCL-projektet med följande filstruktur:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Anta att RazorUIClassLib/Pages/Shared
innehåller två partiella filer: _Header.cshtml
och _Footer.cshtml
. Taggarna <partial>
kan läggas till i _Layout.cshtml
fil:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Razor vyer, sidor, kontroller, sidmodeller, Razor komponenter, vykomponenteroch datamodeller kan byggas in i ett Razor klassbibliotek (RCL). RCL kan paketeras och återanvändas. Program kan inkludera RCL och åsidosätta de vyer och sidor som den innehåller. När en vy, partiell vy eller Razor-sida finns i både webbappen och RCL, har Razor-markupen (.cshtml
-fil) i webbappen företräde.
Visa eller ladda ned exempelkod (hur du laddar ned)
Skapa ett klassbibliotek som innehåller Razor användargränssnitt
- I Visual Studio väljer du Skapa ett nytt projekt.
- Välj Razor Klassbibliotek>Nästa.
- Ge biblioteket namnet (till exempel "RazorClassLib"), >Skapa. Om du vill undvika en filnamnskollision med det genererade visningsbiblioteket kontrollerar du att biblioteksnamnet inte slutar
.Views
. - Välj supportsidor och vyer om du behöver stöd för vyer. Som standard stöds endast Razor sidor. Välj Skapa.
Mall Razor klassbiblioteket (RCL) är som standard inställd för Razor komponentutveckling. Alternativet Support-sidor och vyer stöder sidor och vyer.
Lägg till Razor filer i RCL:en.
ASP.NET Core-mallarna förutsätter att RCL-innehållet finns i mappen Areas
. Se layouten RCL Pages nedan för att skapa en RCL som exponerar innehåll i ~/Pages
i stället för ~/Areas/Pages
.
Referens-RCL-innehåll
RCL kan refereras till av:
- NuGet-paket. Se Skapa NuGet-paket och dotnet lägg till paket och Skapa och publicera ett NuGet-paket.
-
{ProjectName}.csproj
. Se dotnet-add referens.
Åsidosätt vyer, delvyer och sidor
När en vy, partiell vy eller Razor-sida finns i både webbappen och RCL har Razor-markering (.cshtml
-fil) i webbappen företräde. Du kan till exempel lägga till WebApp1/Areas/MyFeature/Pages/Page1.cshtml
i WebApp1, och då kommer Page1 i WebApp1 att ha företräde över Page1 i RCL.
I exempelnedladdningen byter du namn på WebApp1/Areas/MyFeature2
till WebApp1/Areas/MyFeature
för att testa prioritet.
Kopiera RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
partiell vy till WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Uppdatera markering för att ange den nya platsen. Skapa och kör appen för att verifiera att appens version av det partiella används.
Om RCL använder Razor Pages aktiverar du tjänsterna och slutpunkterna för Razor Pages i värdappen:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
Layout för RCL-sidor
Om du vill referera till RCL-innehåll som om det är en del av webbappens Pages
mapp skapar du RCL-projektet med följande filstruktur:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Anta att RazorUIClassLib/Pages/Shared
innehåller två partiella filer: _Header.cshtml
och _Footer.cshtml
. Taggarna <partial>
kan läggas till i _Layout.cshtml
fil:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Lägg till filen _ViewStart.cshtml
i RCL-projektets Pages
-mapp för att använda _Layout.cshtml
-filen från värdwebbappen:
@{
Layout = "_Layout";
}
Skapa en RCL med statiska tillgångar
En RCL kan kräva kompletterande statiska resurser som kan refereras av antingen RCL eller appen som använder RCL. ASP.NET Core gör det möjligt att skapa RCL:er som innehåller statiska tillgångar som är tillgängliga för en förbrukande app.
Om du vill inkludera tillhörande tillgångar som en del av en RCL skapar du en wwwroot
mapp i klassbiblioteket och inkluderar alla nödvändiga filer i mappen.
När du packar en RCL inkluderas alla tillhörande tillgångar i mappen wwwroot
automatiskt i paketet.
Använd kommandot dotnet pack
i stället för NuGet.exe version nuget pack
.
Exkludera statiska tillgångar
Om du vill exkludera statiska tillgångar lägger du till önskad exkluderingssökväg till $(DefaultItemExcludes)
egenskapsgrupp i projektfilen. Avgränsa uppgifter med ett semikolon (;
).
I följande exempel betraktas inte lib.css
-formatmallen i mappen wwwroot
som en statisk tillgång och ingår inte i den publicerade RCL:en:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
Typescript-integrering
Så här inkluderar du TypeScript-filer i en RCL:
Referera till
Microsoft.TypeScript.MSBuild
NuGet-paketet i projektet.Anteckning
Mer information om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket på Arbetsflöde för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Placera TypeScript-filerna (
.ts
) utanför mappenwwwroot
. Placera till exempel filerna i enClient
mapp.Konfigurera TypeScript-kompileringsutdata för mappen
wwwroot
. Ställ in egenskapenTypescriptOutDir
inuti ettPropertyGroup
i projektfilen:<TypescriptOutDir>wwwroot</TypescriptOutDir>
Inkludera TypeScript-målet som ett beroende av det
ResolveCurrentProjectStaticWebAssets
målet genom att lägga till följande mål i enPropertyGroup
i projektfilen:<ResolveCurrentProjectStaticWebAssetsInputsDependsOn> CompileTypeScript; $(ResolveCurrentProjectStaticWebAssetsInputs) </ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
Använd innehåll från en refererad RCL
Filerna som ingår i mappen wwwroot
för RCL exponeras för antingen RCL eller den förbrukande appen under prefixet _content/{PACKAGE ID}/
. Ett bibliotek med sammansättningsnamnet Razor.Class.Lib
och utan en <PackageId>
som anges i projektfilen resulterar till exempel i en sökväg till statiskt innehåll på _content/Razor.Class.Lib/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t enligt beskrivningen i projektfilen för {PACKAGE ID}
.
Den förbrukande appen refererar till statiska tillgångar som tillhandahålls av biblioteket med <script>
, <style>
, <img>
och andra HTML-taggar. Den förbrukande appen måste ha stöd för statiska filer aktiverade i Startup.Configure
:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseStaticFiles();
...
}
När du kör den förbrukande appen från build-utdata (dotnet run
) aktiveras statiska webbtillgångar som standard i utvecklingsmiljön. Anropa UseStaticWebAssets
på värdverktyget i Program.cs
för att stödja tillgångar i andra miljöer när du kör från byggutdata:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStaticWebAssets();
webBuilder.UseStartup<Startup>();
});
}
Det är inte nödvändigt att anropa UseStaticWebAssets
när du kör en app från den publicerade utdata (dotnet publish
).
Utvecklingsflöde för flera projekt
När den konsumerande appen körs:
- Tillgångarna i RCL finns kvar i sina ursprungliga mappar. Tillgångarna flyttas inte till den förbrukande appen.
- Alla ändringar i RCL:s
wwwroot
-mapp återspeglas i den konsumerande appen efter att RCL:en har byggts om och utan att den konsumerande appen byggs om.
När RCL skapas skapas ett manifest som beskriver de statiska webbtillgångsplatserna. Den konsumerande appen läser manifestet vid körning för att använda resurserna från refererade projekt och paket. När en ny tillgång läggs till i en RCL måste RCL återskapas för att uppdatera manifestet innan en förbrukande app kan komma åt den nya tillgången.
Publicera
När appen publiceras kopieras de tillhörande tillgångarna från alla refererade projekt och paket till mappen wwwroot
för den publicerade appen under _content/{PACKAGE ID}/
. När du skapar ett NuGet-paket och sammansättningsnamnet inte är samma som paket-ID :t (<PackageId>
i bibliotekets projektfil) använder du paket-ID:t som anges i projektfilen för {PACKAGE ID}
när du undersöker mappen wwwroot
för de publicerade tillgångarna.
Ytterligare resurser
ASP.NET Core