Erstellen einer wiederverwendbaren Benutzeroberfläche mithilfe eines Razor-Klassenbibliotheksprojekts in ASP.NET Core
Von Rick Anderson
Ansichten, Seiten, Controller, Seitenmodelle, Razor-Komponenten, Anzeigekomponenten und Datenmodelle im Zusammenhang mit Razor können in einer Razor-Klassenbibliothek (Razor Class Library, RCL) zusammengefasst werden. Die RCL kann verpackt und wiederverwendet werden. Sie kann in Anwendungen eingebunden werden, wodurch sich die in der RCL enthaltenen Ansichten und Seiten überschreiben lassen. Wenn eine Ansicht, Teilansicht oder Razor-Seite sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang.
Weitere Informationen zum Integrieren von npm und webpack in den Buildprozess für eine RCL finden Sie unter Erstellen von Clientwebressourcen für Ihre Razor-Klassenbibliothek.
Erstellen einer Klassenbibliothek, die eine Razor-Benutzeroberfläche enthält
- Klicken Sie in Visual Studio auf Neues Projekt erstellen.
- Wählen Sie Razor-Klassenbibliothek>Weiter aus.
- Benennen Sie die Bibliothek (z. B. „RazorClassLib“), und klicken Sie auf >Erstellen. Stellen Sie sicher, dass der Bibliotheksname nicht auf
.Views
endet, um zu verhindern, dass es zu einem Dateinamenkonflikt mit der generierten Ansichtsbibliothek kommt. - Wählen Sie Supportseiten und Ansichten aus, wenn Sie die Bibliothek benötigen, um Seiten und/oder Ansichten zu enthalten. Standardmäßig werden nur Razor-Komponenten unterstützt. Klicken Sie auf Erstellen.
Die Vorlage der Razor-Klassenbibliothek gilt standardmäßig für die Razor-Komponentenentwicklung. Mit der Option Support pages and views (Seiten und Ansichten unterstützen) werden Seiten und Ansichten unterstützt. Weitere Informationen zum Support für RCLs in Blazor finden Sie unter Nutzen von ASP.NET Core Razor-Komponenten über eine Razor-Klassenbibliothek (RCL).
Fügen Sie der RCL Razor-Dateien zu.
Die ASP.NET Core-Vorlagen gehen davon aus, dass die RCL-Inhalte sich im Ordner Areas
befinden. Im Abschnitt RCL-Seitenlayout unten wird gezeigt, wie Sie eine RCL erstellen, die Inhalte aus ~/Pages
statt aus ~/Areas/Pages
verfügbar macht.
Verweisen auf RCL-Inhalte
Folgende Komponenten können auf die RCL verweisen:
- NuGet-Pakete. Weitere Informationen finden Sie unter Creating NuGet packages (Erstellen von NuGet-Paketen), dotnet add package und Erstellen und Veröffentlichen eines NuGet-Pakets.
{ProjectName}.csproj
. Weitere Informationen finden Sie unter dotnet add reference.
Überschreiben von Ansichten, Teilansichten und Seiten
Wenn eine Ansicht, Teilansicht oder Razor Page sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang. Wenn Sie beispielsweise WebApp1/Areas/MyFeature/Pages/Page1.cshtml
zu WebApp1 hinzufügen, hat Page1 in WebApp1 Vorrang vor Page1 in der RCL.
Benennen Sie im Beispieldownload WebApp1/Areas/MyFeature2
in WebApp1/Areas/MyFeature
um, um die Rangfolge zu testen.
Kopieren Sie die Teilansicht RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
in WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Aktualisieren Sie das Markup, um den neuen Speicherort anzugeben. Erstellen Sie die App, und führen Sie sie aus, um sicherzustellen, dass die Version mit der Teilansicht der App verwendet wird.
Wenn die RCL Razor Pages verwendet, aktivieren Sie die Razor Pages-Dienste und -Endpunkte in der Hosting-App:
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();
RCL-Seitenlayout
Erstellen Sie ein RCL-Projekt mit der folgenden Dateistruktur, um auf RCL-Inhalte so zu verweisen, als seien diese im Ordner Pages
der Web-App abgelegt:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Nehmen Sie an, dass RazorUIClassLib/Pages/Shared
zwei Teildateien enthält: _Header.cshtml
und _Footer.cshtml
. Die <partial>
-Tags könnten dann in der Datei _Layout.cshtml
hinzugefügt werden:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Fügen Sie die Datei _ViewStart.cshtml
zum Ordner Pages
des RCL-Projekts hinzu, um die Datei _Layout.cshtml
über die Host-Web-App zu verwenden:
@{
Layout = "_Layout";
}
Erstellen einer RCL mit statischen Objekten
Eine RCL kann statische Begleitobjekte erfordern, auf die entweder in der RCL oder in der App, die die RCL verwendet, verwiesen werden kann. ASP.NET Core ermöglicht das Erstellen von RCLs mit statischen Objekten, die verwendenden Apps zur Verfügung stehen.
Wenn Sie Begleitobjekte zu einer RCL hinzufügen möchten, müssen Sie einen Ordner namens wwwroot
in der Klassenbibliothek erstellen und alle erforderlichen Dateien in diesem Ordner ablegen.
Beim Packen einer RCL werden alle Begleitobjekte im Ordner wwwroot
automatisch in das Paket gepackt.
Verwenden Sie den dotnet pack
-Befehl anstelle der NuGet.exe-Version nuget pack
.
Hinzufügen von Clientwebressourcen zum Buildprozess
Das Integrieren von Clientwebressourcen in die Buildpipeline ist nicht trivial. Weitere Informationen finden Sie unter Erstellen von Clientwebressourcen für Ihre Razor-Klassenbibliothek.
Ausschließen statischer Objekte
Fügen Sie den gewünschten Ausschlusspfad zur Eigenschaftengruppe $(DefaultItemExcludes)
in der Projektdatei hinzu, um statische Objekte auszuschließen. Trennen Sie Einträge durch ein Semikolon (;
).
Im folgenden Beispiel wird das Stylesheet lib.css
im Ordner wwwroot
nicht als statisches Objekt angesehen und nicht in die veröffentlichte RCL aufgenommen:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
TypeScript-Integration
Gehen Sie wie folgt vor, um TypeScript-Dateien in eine RCL aufzunehmen:
Verweisen Sie im Projekt auf das NuGet-Paket
Microsoft.TypeScript.MSBuild
.Hinweis
Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Speichern Sie die TypeScript-Dateien (
.ts
) außerhalb des Ordnerswwwroot
. Legen Sie sie zum Beispiel im OrdnerClient
ab.Konfigurieren Sie die TypeScript-Buildausgabe für den Ordner
wwwroot
. Legen Sie dieTypescriptOutDir
-Eigenschaft in einer Eigenschaftengruppe (PropertyGroup
) wie folgt in der Projektdatei fest:<TypescriptOutDir>wwwroot</TypescriptOutDir>
Fügen Sie das TypeScript-Ziel als Abhängigkeit des Ziels
PrepareForBuildDependsOn
hinzu, indem Sie das folgende Ziel in einer Eigenschaftengruppe (PropertyGroup
) in der Projektdatei hinzufügen:<PrepareForBuildDependsOn> CompileTypeScript; GetTypeScriptOutputForPublishing;$(PrepareForBuildDependsOn) </PrepareForBuildDependsOn>
Inhalte aus einer RCL, auf die verwiesen wird, verwenden
Die Dateien im Ordner wwwroot
der RCL werden entweder für die RCL oder für die verwendende App unter dem Präfix _content/{PACKAGE ID}/
verfügbar gemacht. Beispielsweise führt eine Bibliothek mit dem Assemblynamen Razor.Class.Lib
, bei der <PackageId>
nicht in der Projektdatei angegeben wird, zu einem Pfad zu statischem Inhalt unter _content/Razor.Class.Lib/
. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID.
Die verwendende App verweist auf statische Objekte, die von der Bibliothek bereitgestellt werden, mit <script>
, <style>
, <img>
und anderen HTML-Tags. Bei der verarbeitenden App muss statischer Dateisupport aktiviert sein:
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();
Beim Ausführen der verwendenden App in der Buildausgabe (dotnet run
) sind statische Webobjekte in der Entwicklungsumgebung standardmäßig aktiviert. Wenn beim Ausführen in der Buildausgabe Objekte in anderen Umgebungen unterstützt werden sollen, rufen Sie UseStaticWebAssets im Host-Generator in Program.cs
auf:
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();
UseStaticWebAssets
muss nicht aufgerufen werden, wenn eine App in der veröffentlichten Ausgabe ausgeführt wird (dotnet publish
).
Entwicklungsablauf bei mehreren Projekten
Wenn die verwendende App ausgeführt wird:
- bleiben die Objekte in der RCL in ihren ursprünglichen Ordnern. werden die Objekte nicht in die verwendende App verschoben.
- Änderungen im Ordner
wwwroot
der RCL werden in der verwendenden App abgebildet, sobald die RCL neu erstellt wurde, ohne dass die verwendende App neu erstellt werden muss.
Wenn die RCL erstellt wird, wird ein Manifest erstellt, in dem die Speicherorte der statischen Webobjekte stehen. Die verwendende App liest das Manifest zur Laufzeit, um die Objekte aus den Projekten und Paketen, auf die verwiesen wird, zu verwenden. Wenn ein neues Objekt zu einer RCL hinzugefügt wird, muss die RCL neu erstellt werden, um das Manifest zu aktualisieren, damit verwendende Apps auf das neue Objekt zugreifen können.
Veröffentlichen
Wenn die App veröffentlicht wird, werden die Begleitobjekte aus allen Projekten und Paketen, auf die verwiesen wird, in den Ordner wwwroot
der veröffentlichten App unter _content/{PACKAGE ID}/
kopiert. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID, wenn Sie den Ordner wwwroot
für die veröffentlichten Ressourcen untersuchen.
Zusätzliche Ressourcen
Ansichten, Seiten, Controller, Seitenmodelle, Razor-Komponenten, Anzeigekomponenten und Datenmodelle im Zusammenhang mit Razor können in einer Razor-Klassenbibliothek (Razor Class Library, RCL) zusammengefasst werden. Die RCL kann verpackt und wiederverwendet werden. Sie kann in Anwendungen eingebunden werden, wodurch sich die in der RCL enthaltenen Ansichten und Seiten überschreiben lassen. Wenn eine Ansicht, Teilansicht oder Razor-Seite sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang.
Weitere Informationen zum Integrieren von npm und webpack in den Buildprozess für eine Razor-Klassenbibliothek finden Sie unter Erstellen von Clientwebressourcen für Ihre Razor-Klassenbibliothek.
Erstellen einer Klassenbibliothek, die eine Razor-Benutzeroberfläche enthält
- Klicken Sie in Visual Studio auf Neues Projekt erstellen.
- Wählen Sie Razor-Klassenbibliothek>Weiter aus.
- Benennen Sie die Bibliothek (z. B. „RazorClassLib“), und klicken Sie auf >Erstellen. Stellen Sie sicher, dass der Bibliotheksname nicht auf
.Views
endet, um zu verhindern, dass es zu einem Dateinamenkonflikt mit der generierten Ansichtsbibliothek kommt. - Klicken Sie auf Support pages and views (Seiten und Ansichten unterstützen), wenn Ansichten unterstützt werden sollen. Standardmäßig werden nur Razor-Seiten unterstützt. Wählen Sie Erstellen aus.
Die Vorlage der Razor-Klassenbibliothek (RCL) gilt standardmäßig für die Razor-Komponentenentwicklung. Mit der Option Support pages and views (Seiten und Ansichten unterstützen) werden Seiten und Ansichten unterstützt.
Fügen Sie der RCL Razor-Dateien zu.
Die ASP.NET Core-Vorlagen gehen davon aus, dass die RCL-Inhalte sich im Ordner Areas
befinden. Im Abschnitt RCL-Seitenlayout unten wird gezeigt, wie Sie eine RCL erstellen, die Inhalte aus ~/Pages
statt aus ~/Areas/Pages
verfügbar macht.
Verweisen auf RCL-Inhalte
Folgende Komponenten können auf die RCL verweisen:
- NuGet-Pakete. Weitere Informationen finden Sie unter Creating NuGet packages (Erstellen von NuGet-Paketen), dotnet add package und Erstellen und Veröffentlichen eines NuGet-Pakets.
{ProjectName}.csproj
. Weitere Informationen finden Sie unter dotnet add reference.
Überschreiben von Ansichten, Teilansichten und Seiten
Wenn eine Ansicht, Teilansicht oder Razor Page sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang. Wenn Sie beispielsweise WebApp1/Areas/MyFeature/Pages/Page1.cshtml
zu WebApp1 hinzufügen, hat Page1 in WebApp1 Vorrang vor Page1 in der RCL.
Benennen Sie im Beispieldownload WebApp1/Areas/MyFeature2
in WebApp1/Areas/MyFeature
um, um die Rangfolge zu testen.
Kopieren Sie die Teilansicht RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
in WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Aktualisieren Sie das Markup, um den neuen Speicherort anzugeben. Erstellen Sie die App, und führen Sie sie aus, um sicherzustellen, dass die Version mit der Teilansicht der App verwendet wird.
Wenn die RCL Razor Pages verwendet, aktivieren Sie die Razor Pages-Dienste und -Endpunkte in der Hosting-App:
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();
RCL-Seitenlayout
Erstellen Sie ein RCL-Projekt mit der folgenden Dateistruktur, um auf RCL-Inhalte so zu verweisen, als seien diese im Ordner Pages
der Web-App abgelegt:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Nehmen Sie an, dass RazorUIClassLib/Pages/Shared
zwei Teildateien enthält: _Header.cshtml
und _Footer.cshtml
. Die <partial>
-Tags könnten dann in der Datei _Layout.cshtml
hinzugefügt werden:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Fügen Sie die Datei _ViewStart.cshtml
zum Ordner Pages
des RCL-Projekts hinzu, um die Datei _Layout.cshtml
über die Host-Web-App zu verwenden:
@{
Layout = "_Layout";
}
Erstellen einer RCL mit statischen Objekten
Eine RCL kann statische Begleitobjekte erfordern, auf die entweder in der RCL oder in der App, die die RCL verwendet, verwiesen werden kann. ASP.NET Core ermöglicht das Erstellen von RCLs mit statischen Objekten, die verwendenden Apps zur Verfügung stehen.
Wenn Sie Begleitobjekte zu einer RCL hinzufügen möchten, müssen Sie einen Ordner namens wwwroot
in der Klassenbibliothek erstellen und alle erforderlichen Dateien in diesem Ordner ablegen.
Beim Packen einer RCL werden alle Begleitobjekte im Ordner wwwroot
automatisch in das Paket gepackt.
Verwenden Sie den dotnet pack
-Befehl anstelle der NuGet.exe-Version nuget pack
.
Ausschließen statischer Objekte
Fügen Sie den gewünschten Ausschlusspfad zur Eigenschaftengruppe $(DefaultItemExcludes)
in der Projektdatei hinzu, um statische Objekte auszuschließen. Trennen Sie Einträge durch ein Semikolon (;
).
Im folgenden Beispiel wird das Stylesheet lib.css
im Ordner wwwroot
nicht als statisches Objekt angesehen und nicht in die veröffentlichte RCL aufgenommen:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
TypeScript-Integration
Gehen Sie wie folgt vor, um TypeScript-Dateien in eine RCL aufzunehmen:
Verweisen Sie im Projekt auf das NuGet-Paket
Microsoft.TypeScript.MSBuild
.Hinweis
Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Speichern Sie die TypeScript-Dateien (
.ts
) außerhalb des Ordnerswwwroot
. Legen Sie sie zum Beispiel im OrdnerClient
ab.Konfigurieren Sie die TypeScript-Buildausgabe für den Ordner
wwwroot
. Legen Sie dieTypescriptOutDir
-Eigenschaft in einer Eigenschaftengruppe (PropertyGroup
) wie folgt in der Projektdatei fest:<TypescriptOutDir>wwwroot</TypescriptOutDir>
Fügen Sie das TypeScript-Ziel als Abhängigkeit des Ziels
PrepareForBuildDependsOn
hinzu, indem Sie das folgende Ziel in einer Eigenschaftengruppe (PropertyGroup
) in der Projektdatei hinzufügen:<PrepareForBuildDependsOn> CompileTypeScript; GetTypeScriptOutputForPublishing;$(PrepareForBuildDependsOn) </PrepareForBuildDependsOn>
Inhalte aus einer RCL, auf die verwiesen wird, verwenden
Die Dateien im Ordner wwwroot
der RCL werden entweder für die RCL oder für die verwendende App unter dem Präfix _content/{PACKAGE ID}/
verfügbar gemacht. Beispielsweise führt eine Bibliothek mit dem Assemblynamen Razor.Class.Lib
, bei der <PackageId>
nicht in der Projektdatei angegeben wird, zu einem Pfad zu statischem Inhalt unter _content/Razor.Class.Lib/
. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID.
Die verwendende App verweist auf statische Objekte, die von der Bibliothek bereitgestellt werden, mit <script>
, <style>
, <img>
und anderen HTML-Tags. Bei der verarbeitenden App muss statischer Dateisupport aktiviert sein:
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();
Beim Ausführen der verwendenden App in der Buildausgabe (dotnet run
) sind statische Webobjekte in der Entwicklungsumgebung standardmäßig aktiviert. Wenn beim Ausführen in der Buildausgabe Objekte in anderen Umgebungen unterstützt werden sollen, rufen Sie UseStaticWebAssets im Host-Generator in Program.cs
auf:
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();
Hinweis: .NET 6 erfordert nur den Aufruf builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets
. Weitere Informationen finden Sie in diesem GitHub-Issue.
UseStaticWebAssets
muss nicht aufgerufen werden, wenn eine App in der veröffentlichten Ausgabe ausgeführt wird (dotnet publish
).
Entwicklungsablauf bei mehreren Projekten
Wenn die verwendende App ausgeführt wird:
- bleiben die Objekte in der RCL in ihren ursprünglichen Ordnern. werden die Objekte nicht in die verwendende App verschoben.
- Änderungen im Ordner
wwwroot
der RCL werden in der verwendenden App abgebildet, sobald die RCL neu erstellt wurde, ohne dass die verwendende App neu erstellt werden muss.
Wenn die RCL erstellt wird, wird ein Manifest erstellt, in dem die Speicherorte der statischen Webobjekte stehen. Die verwendende App liest das Manifest zur Laufzeit, um die Objekte aus den Projekten und Paketen, auf die verwiesen wird, zu verwenden. Wenn ein neues Objekt zu einer RCL hinzugefügt wird, muss die RCL neu erstellt werden, um das Manifest zu aktualisieren, damit verwendende Apps auf das neue Objekt zugreifen können.
Veröffentlichen
Wenn die App veröffentlicht wird, werden die Begleitobjekte aus allen Projekten und Paketen, auf die verwiesen wird, in den Ordner wwwroot
der veröffentlichten App unter _content/{PACKAGE ID}/
kopiert. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID, wenn Sie den Ordner wwwroot
für die veröffentlichten Ressourcen untersuchen.
Zusätzliche Ressourcen
Ansichten, Seiten, Controller, Seitenmodelle, Razor-Komponenten, Anzeigekomponenten und Datenmodelle im Zusammenhang mit Razor können in einer Razor-Klassenbibliothek (Razor Class Library, RCL) zusammengefasst werden. Die RCL kann verpackt und wiederverwendet werden. Sie kann in Anwendungen eingebunden werden, wodurch sich die in der RCL enthaltenen Ansichten und Seiten überschreiben lassen. Wenn eine Ansicht, Teilansicht oder Razor-Seite sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang.
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Erstellen einer Klassenbibliothek, die eine Razor-Benutzeroberfläche enthält
- Wählen Sie in Visual Studio Neues Projekt erstellen aus.
- Wählen Sie Razor-Klassenbibliothek>Weiter aus.
- Benennen Sie die Bibliothek (z. B. „RazorClassLib“) und klicken Sie auf >Erstellen>Weiter. Stellen Sie sicher, dass der Bibliotheksname nicht auf
.Views
endet, um zu verhindern, dass es zu einem Dateinamenkonflikt mit der generierten Ansichtsbibliothek kommt. - Wählen Sie das Zielframework aus. Aktivieren Sie ☑ Seiten und Ansichten unterstützen, um Ansichten zu unterstützen. Standardmäßig werden nur Razor-Komponenten unterstützt. Wählen Sie Erstellen aus.
Die Vorlage der Razor-Klassenbibliothek (Razor Class Library, RCL) gilt standardmäßig für die Razor-Komponentenentwicklung. Mit der Option Support pages and views (Seiten und Ansichten unterstützen) werden Seiten und Ansichten unterstützt.
Fügen Sie der RCL Razor-Dateien zu.
Die ASP.NET Core-Vorlagen gehen davon aus, dass die RCL-Inhalte sich im Ordner Areas
befinden. Im Abschnitt RCL-Seitenlayout wird gezeigt, wie Sie eine RCL erstellen, die Inhalte aus ~/Pages
statt aus ~/Areas/Pages
verfügbar macht.
Verweisen auf RCL-Inhalte
Folgende Komponenten können auf die RCL verweisen:
- NuGet-Pakete. Weitere Informationen finden Sie unter Creating NuGet packages (Erstellen von NuGet-Paketen), dotnet add package und Erstellen und Veröffentlichen eines NuGet-Pakets.
{ProjectName}.csproj
. Weitere Informationen finden Sie unter dotnet add reference.
Überschreiben von Ansichten, Teilansichten und Seiten
Wenn eine Ansicht, Teilansicht oder Razor Page sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang. Wenn Sie beispielsweise WebApp1/Areas/MyFeature/Pages/Page1.cshtml
zu WebApp1 hinzufügen, hat Page1 in WebApp1 Vorrang vor Page1 in der RCL.
Benennen Sie im Beispieldownload WebApp1/Areas/MyFeature2
in WebApp1/Areas/MyFeature
um, um die Rangfolge zu testen.
Kopieren Sie die Teilansicht RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
in WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Aktualisieren Sie das Markup, um den neuen Speicherort anzugeben. Erstellen Sie die App, und führen Sie sie aus, um sicherzustellen, dass die Version mit der Teilansicht der App verwendet wird.
RCL-Seitenlayout
Erstellen Sie ein RCL-Projekt mit der folgenden Dateistruktur, um auf RCL-Inhalte so zu verweisen, als seien diese im Ordner Pages
der Web-App abgelegt:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Nehmen Sie an, dass RazorUIClassLib/Pages/Shared
zwei Teildateien enthält: _Header.cshtml
und _Footer.cshtml
. Die <partial>
-Tags könnten dann in der Datei _Layout.cshtml
hinzugefügt werden:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Fügen Sie die Datei _ViewStart.cshtml
zum Ordner Pages
des RCL-Projekts hinzu, um die Datei _Layout.cshtml
über die Host-Web-App zu verwenden:
@{
Layout = "_Layout";
}
Erstellen einer RCL mit statischen Objekten
Eine RCL kann statische Begleitobjekte erfordern, auf die entweder in der RCL oder in der App, die die RCL verwendet, verwiesen werden kann. ASP.NET Core ermöglicht das Erstellen von RCLs mit statischen Objekten, die verwendenden Apps zur Verfügung stehen.
Wenn Sie Begleitobjekte zu einer RCL hinzufügen möchten, müssen Sie einen Ordner namens wwwroot
in der Klassenbibliothek erstellen und alle erforderlichen Dateien in diesem Ordner ablegen.
Beim Packen einer RCL werden alle Begleitobjekte im Ordner wwwroot
automatisch in das Paket gepackt.
Verwenden Sie den dotnet pack
-Befehl anstelle der NuGet.exe-Version nuget pack
.
Ausschließen statischer Objekte
Fügen Sie den gewünschten Ausschlusspfad zur Eigenschaftengruppe $(DefaultItemExcludes)
in der Projektdatei hinzu, um statische Objekte auszuschließen. Trennen Sie Einträge durch ein Semikolon (;
).
Im folgenden Beispiel wird das Stylesheet lib.css
im Ordner wwwroot
nicht als statisches Objekt angesehen und nicht in die veröffentlichte RCL aufgenommen:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
TypeScript-Integration
Gehen Sie wie folgt vor, um TypeScript-Dateien in eine RCL aufzunehmen:
Verweisen Sie im Projekt auf das NuGet-Paket
Microsoft.TypeScript.MSBuild
.Hinweis
Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Speichern Sie die TypeScript-Dateien (
.ts
) außerhalb des Ordnerswwwroot
. Legen Sie sie zum Beispiel im OrdnerClient
ab.Konfigurieren Sie die TypeScript-Buildausgabe für den Ordner
wwwroot
. Legen Sie dieTypescriptOutDir
-Eigenschaft in einer Eigenschaftengruppe (PropertyGroup
) wie folgt in der Projektdatei fest:<TypescriptOutDir>wwwroot</TypescriptOutDir>
Fügen Sie das TypeScript-Ziel als Abhängigkeit des Ziels
ResolveCurrentProjectStaticWebAssets
hinzu, indem Sie das folgende Ziel in einer Eigenschaftengruppe (PropertyGroup
) in der Projektdatei hinzufügen:<ResolveCurrentProjectStaticWebAssetsInputsDependsOn> CompileTypeScript; $(ResolveCurrentProjectStaticWebAssetsInputs) </ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
Inhalte aus einer RCL, auf die verwiesen wird, verwenden
Die Dateien im Ordner wwwroot
der RCL werden entweder für die RCL oder für die verwendende App unter dem Präfix _content/{PACKAGE ID}/
verfügbar gemacht. Beispielsweise führt eine Bibliothek mit dem Assemblynamen Razor.Class.Lib
, bei der <PackageId>
nicht in der Projektdatei angegeben wird, zu einem Pfad zu statischem Inhalt unter _content/Razor.Class.Lib/
. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID.
Die verwendende App verweist auf statische Objekte, die von der Bibliothek bereitgestellt werden, mit <script>
, <style>
, <img>
und anderen HTML-Tags. Bei der verwendenden App muss static file support (Unterstützung von statischen Dateien) in Startup.Configure
aktiviert sein:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseStaticFiles();
...
}
Beim Ausführen der verwendenden App in der Buildausgabe (dotnet run
) sind statische Webobjekte in der Entwicklungsumgebung standardmäßig aktiviert. Wenn beim Ausführen in der Buildausgabe Objekte in anderen Umgebungen unterstützt werden sollen, rufen Sie UseStaticWebAssets
im Host-Generator in Program.cs
auf:
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>();
});
}
UseStaticWebAssets
muss nicht aufgerufen werden, wenn eine App in der veröffentlichten Ausgabe ausgeführt wird (dotnet publish
).
Entwicklungsablauf bei mehreren Projekten
Wenn die verwendende App ausgeführt wird:
- bleiben die Objekte in der RCL in ihren ursprünglichen Ordnern. werden die Objekte nicht in die verwendende App verschoben.
- Änderungen im Ordner
wwwroot
der RCL werden in der verwendenden App abgebildet, sobald die RCL neu erstellt wurde, ohne dass die verwendende App neu erstellt werden muss.
Wenn die RCL erstellt wird, wird ein Manifest erstellt, in dem die Speicherorte der statischen Webobjekte stehen. Die verwendende App liest das Manifest zur Laufzeit, um die Objekte aus den Projekten und Paketen, auf die verwiesen wird, zu verwenden. Wenn ein neues Objekt zu einer RCL hinzugefügt wird, muss die RCL neu erstellt werden, um das Manifest zu aktualisieren, damit verwendende Apps auf das neue Objekt zugreifen können.
Veröffentlichen
Wenn die App veröffentlicht wird, werden die Begleitobjekte aus allen Projekten und Paketen, auf die verwiesen wird, in den Ordner wwwroot
der veröffentlichten App unter _content/{PACKAGE ID}/
kopiert. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID, wenn Sie den Ordner wwwroot
für die veröffentlichten Ressourcen untersuchen.
Zusätzliche Ressourcen
Ansichten, Seiten, Controller, Seitenmodelle, Razor-Komponenten, Anzeigekomponenten und Datenmodelle im Zusammenhang mit Razor können in einer Razor-Klassenbibliothek (Razor Class Library, RCL) zusammengefasst werden. Die RCL kann verpackt und wiederverwendet werden. Sie kann in Anwendungen eingebunden werden, wodurch sich die in der RCL enthaltenen Ansichten und Seiten überschreiben lassen. Wenn eine Ansicht, Teilansicht oder Razor-Seite sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang.
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Erstellen einer Klassenbibliothek, die eine Razor-Benutzeroberfläche enthält
- Klicken Sie in Visual Studio im Menü Datei auf Neu>Projekt.
- Wählen Sie ASP.NET Core-Webanwendung aus.
- Geben Sie der Bibliothek einen Namen (z.B. „RazorClassLib“) und klicken Sie anschließend auf >OK. Stellen Sie sicher, dass der Bibliotheksname nicht auf
.Views
endet, um zu verhindern, dass es zu einem Dateinamenkonflikt mit der generierten Ansichtsbibliothek kommt. - Überprüfen Sie, ob ASP.NET Core 2.1 oder höher ausgewählt ist.
- Wählen Sie Razor Klassenbibliothek>OK aus.
Eine RCL verfügt über die folgende Projektdatei:
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Fügen Sie der RCL Razor-Dateien zu.
Die ASP.NET Core-Vorlagen gehen davon aus, dass die RCL-Inhalte sich im Ordner Areas
befinden. Im Abschnitt RCL-Seitenlayout wird gezeigt, wie Sie eine RCL erstellen, die Inhalte aus ~/Pages
statt aus ~/Areas/Pages
verfügbar macht.
Verweisen auf RCL-Inhalte
Folgende Komponenten können auf die RCL verweisen:
- NuGet-Pakete. Weitere Informationen finden Sie unter Creating NuGet packages (Erstellen von NuGet-Paketen), dotnet add package und Erstellen und Veröffentlichen eines NuGet-Pakets.
{ProjectName}.csproj
. Weitere Informationen finden Sie unter dotnet add reference.
Exemplarische Vorgehensweise: Erstellen eines RCL-Projekts und dessen Verwendung in einem Razor Pages-Projekt
Sie können das vollständige Projekt herunterladen und testen, anstatt es zu erstellen. Der Beispieldownload enthält zusätzlichen Code sowie Links, die das Testen des Projekts erleichtern. In diesem GitHub-Issue können Sie in Form von Kommentaren Feedback zu Unterschieden zwischen Beispieldownloads und ausführlichen Anleitungen geben.
Testen der heruntergeladenen App
Wenn Sie die vollständige App nicht heruntergeladen haben und das Beispielprojekt selbst erstellen möchten, können Sie mit dem nächsten Abschnitt fortfahren.
Öffnen Sie die .sln
-Datei in Visual Studio. Führen Sie die App aus.
Folgen Sie den Anweisungen in Testen des WebApp1-Projekts.
Erstellen einer RCL
In diesem Abschnitt wird eine RCL erstellt. Dabei werden der RCL Razor-Dateien hinzugefügt.
Erstellen Sie das RCL-Projekt:
- Klicken Sie in Visual Studio im Menü Datei auf Neu>Projekt.
- Wählen Sie ASP.NET Core-Webanwendung aus.
- Geben Sie der App den Namen RazorUIClassLib>OK
- Überprüfen Sie, ob ASP.NET Core 2.1 oder höher ausgewählt ist.
- Wählen Sie Razor Klassenbibliothek>OK aus.
- Fügen Sie die Datei
RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
für eine Razor-Teilansicht hinzu.
Hinzufügen von Razor-Dateien und -Ordnern zum Projekt
Ersetzen Sie das Markup in
RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
durch den folgenden Code:<h3>_Message.cshtml partial view.</h3> <p>RazorUIClassLib\Areas\MyFeature\Pages\Shared\_Message.cshtml</p>
Ersetzen Sie das Markup in
RazorUIClassLib/Areas/MyFeature/Pages/Page1.cshtml
durch den folgenden Code:@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
ist erforderlich, um die Teilansicht<partial name="_Message" />
verwenden zu können. Wenn Sie nicht die@addTagHelper
-Anweisung einbinden möchten, können Sie die Datei_ViewImports.cshtml
hinzufügen. Beispiel:dotnet new viewimports -o RazorUIClassLib/Areas/MyFeature/Pages
Weitere Informationen zu
_ViewImports.cshtml
finden Sie unter Importieren gemeinsam verwendeter Anweisungen.Erstellen Sie die Klassenbibliothek, um sicherzustellen, dass keine Compilerfehler vorliegen:
dotnet build RazorUIClassLib
Die Buildausgabe enthält RazorUIClassLib.dll
und RazorUIClassLib.Views.dll
. RazorUIClassLib.Views.dll
enthält den kompilierten Razor-Inhalt.
Verwenden der Razor-Benutzeroberflächenbibliothek über ein Razor Pages-Projekt
Erstellen Sie die Razor Pages-Web-App:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe und anschließend auf >Hinzufügen>Neues Projekt.
Wählen Sie ASP.NET Core-Webanwendung aus.
Legen Sie als Namen für die App WebApp1 fest.
Überprüfen Sie, ob ASP.NET Core 2.1 oder höher ausgewählt ist.
Klicken Sie auf Webanwendung>OK.
Klicken Sie im Projektmappen-Explorer zuerst mit der rechten Maustaste auf WebApp1 und anschließend auf Als Startprojekt festlegen.
Klicken Sie im Projektmappen-Explorer zuerst mit der rechten Maustaste auf WebApp1 und anschließend auf Buildabhängigkeiten>Projektabhängigkeiten.
Aktivieren Sie für WebApp1 die Abhängigkeit RazorUIClassLib.
Klicken Sie im Projektmappen-Explorer zuerst mit der rechten Maustaste auf WebApp1 und anschließend auf Hinzufügen>Verweis.
Aktivieren Sie im Dialogfeld Verweis-Manager das Kontrollkästchen neben RazorUIClassLib, und klicken Sie anschließend auf OK.
Führen Sie die App aus.
Testen des WebApp1-Projekts
Wechseln Sie zu /MyFeature/Page1
, um zu überprüfen, ob die Klassenbibliothek der Razor-Benutzeroberfläche verwendet wird.
Überschreiben von Ansichten, Teilansichten und Seiten
Wenn eine Ansicht, Teilansicht oder Razor Page sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang. Wenn Sie beispielsweise WebApp1/Areas/MyFeature/Pages/Page1.cshtml
zu WebApp1 hinzufügen, hat Page1 in WebApp1 Vorrang vor Page1 in der RCL.
Benennen Sie im Beispieldownload WebApp1/Areas/MyFeature2
in WebApp1/Areas/MyFeature
um, um die Rangfolge zu testen.
Kopieren Sie die Teilansicht RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
in WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Aktualisieren Sie das Markup, um den neuen Speicherort anzugeben. Erstellen Sie die App, und führen Sie sie aus, um sicherzustellen, dass die Version mit der Teilansicht der App verwendet wird.
RCL-Seitenlayout
Erstellen Sie ein RCL-Projekt mit der folgenden Dateistruktur, um auf RCL-Inhalte so zu verweisen, als seien diese im Ordner Pages
der Web-App abgelegt:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Nehmen Sie an, dass RazorUIClassLib/Pages/Shared
zwei Teildateien enthält: _Header.cshtml
und _Footer.cshtml
. Die <partial>
-Tags könnten dann in der Datei _Layout.cshtml
hinzugefügt werden:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Ansichten, Seiten, Controller, Seitenmodelle, Razor-Komponenten, Anzeigekomponenten und Datenmodelle im Zusammenhang mit Razor können in einer Razor-Klassenbibliothek (Razor Class Library, RCL) zusammengefasst werden. Die RCL kann verpackt und wiederverwendet werden. Sie kann in Anwendungen eingebunden werden, wodurch sich die in der RCL enthaltenen Ansichten und Seiten überschreiben lassen. Wenn eine Ansicht, Teilansicht oder Razor-Seite sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang.
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Erstellen einer Klassenbibliothek, die eine Razor-Benutzeroberfläche enthält
- Klicken Sie in Visual Studio auf Neues Projekt erstellen.
- Wählen Sie Razor-Klassenbibliothek>Weiter aus.
- Benennen Sie die Bibliothek (z. B. „RazorClassLib“), und klicken Sie auf >Erstellen. Stellen Sie sicher, dass der Bibliotheksname nicht auf
.Views
endet, um zu verhindern, dass es zu einem Dateinamenkonflikt mit der generierten Ansichtsbibliothek kommt. - Klicken Sie auf Support pages and views (Seiten und Ansichten unterstützen), wenn Ansichten unterstützt werden sollen. Standardmäßig werden nur Razor-Seiten unterstützt. Wählen Sie Erstellen aus.
Die Vorlage der Razor-Klassenbibliothek (Razor Class Library, RCL) gilt standardmäßig für die Razor-Komponentenentwicklung. Mit der Option Support pages and views (Seiten und Ansichten unterstützen) werden Seiten und Ansichten unterstützt.
Fügen Sie der RCL Razor-Dateien zu.
Die ASP.NET Core-Vorlagen gehen davon aus, dass die RCL-Inhalte sich im Ordner Areas
befinden. Im Abschnitt RCL-Seitenlayout unten wird gezeigt, wie Sie eine RCL erstellen, die Inhalte aus ~/Pages
statt aus ~/Areas/Pages
verfügbar macht.
Verweisen auf RCL-Inhalte
Folgende Komponenten können auf die RCL verweisen:
- NuGet-Pakete. Weitere Informationen finden Sie unter Creating NuGet packages (Erstellen von NuGet-Paketen), dotnet add package und Erstellen und Veröffentlichen eines NuGet-Pakets.
{ProjectName}.csproj
. Weitere Informationen finden Sie unter dotnet add reference.
Überschreiben von Ansichten, Teilansichten und Seiten
Wenn eine Ansicht, Teilansicht oder Razor Page sowohl in der Web-App als auch in der RCL enthalten ist, hat das Razor-Markup (die .cshtml
-Datei) in der Web-App Vorrang. Wenn Sie beispielsweise WebApp1/Areas/MyFeature/Pages/Page1.cshtml
zu WebApp1 hinzufügen, hat Page1 in WebApp1 Vorrang vor Page1 in der RCL.
Benennen Sie im Beispieldownload WebApp1/Areas/MyFeature2
in WebApp1/Areas/MyFeature
um, um die Rangfolge zu testen.
Kopieren Sie die Teilansicht RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml
in WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml
. Aktualisieren Sie das Markup, um den neuen Speicherort anzugeben. Erstellen Sie die App, und führen Sie sie aus, um sicherzustellen, dass die Version mit der Teilansicht der App verwendet wird.
Wenn die RCL Razor Pages verwendet, aktivieren Sie die Razor Pages-Dienste und -Endpunkte in der Hosting-App:
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();
});
}
RCL-Seitenlayout
Erstellen Sie ein RCL-Projekt mit der folgenden Dateistruktur, um auf RCL-Inhalte so zu verweisen, als seien diese im Ordner Pages
der Web-App abgelegt:
RazorUIClassLib/Pages
RazorUIClassLib/Pages/Shared
Nehmen Sie an, dass RazorUIClassLib/Pages/Shared
zwei Teildateien enthält: _Header.cshtml
und _Footer.cshtml
. Die <partial>
-Tags könnten dann in der Datei _Layout.cshtml
hinzugefügt werden:
<body>
<partial name="_Header">
@RenderBody()
<partial name="_Footer">
</body>
Fügen Sie die Datei _ViewStart.cshtml
zum Ordner Pages
des RCL-Projekts hinzu, um die Datei _Layout.cshtml
über die Host-Web-App zu verwenden:
@{
Layout = "_Layout";
}
Erstellen einer RCL mit statischen Objekten
Eine RCL kann statische Begleitobjekte erfordern, auf die entweder in der RCL oder in der App, die die RCL verwendet, verwiesen werden kann. ASP.NET Core ermöglicht das Erstellen von RCLs mit statischen Objekten, die verwendenden Apps zur Verfügung stehen.
Wenn Sie Begleitobjekte zu einer RCL hinzufügen möchten, müssen Sie einen Ordner namens wwwroot
in der Klassenbibliothek erstellen und alle erforderlichen Dateien in diesem Ordner ablegen.
Beim Packen einer RCL werden alle Begleitobjekte im Ordner wwwroot
automatisch in das Paket gepackt.
Verwenden Sie den dotnet pack
-Befehl anstelle der NuGet.exe-Version nuget pack
.
Ausschließen statischer Objekte
Fügen Sie den gewünschten Ausschlusspfad zur Eigenschaftengruppe $(DefaultItemExcludes)
in der Projektdatei hinzu, um statische Objekte auszuschließen. Trennen Sie Einträge durch ein Semikolon (;
).
Im folgenden Beispiel wird das Stylesheet lib.css
im Ordner wwwroot
nicht als statisches Objekt angesehen und nicht in die veröffentlichte RCL aufgenommen:
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>
TypeScript-Integration
Gehen Sie wie folgt vor, um TypeScript-Dateien in eine RCL aufzunehmen:
Verweisen Sie im Projekt auf das NuGet-Paket
Microsoft.TypeScript.MSBuild
.Hinweis
Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Speichern Sie die TypeScript-Dateien (
.ts
) außerhalb des Ordnerswwwroot
. Legen Sie sie zum Beispiel im OrdnerClient
ab.Konfigurieren Sie die TypeScript-Buildausgabe für den Ordner
wwwroot
. Legen Sie dieTypescriptOutDir
-Eigenschaft in einer Eigenschaftengruppe (PropertyGroup
) wie folgt in der Projektdatei fest:<TypescriptOutDir>wwwroot</TypescriptOutDir>
Fügen Sie das TypeScript-Ziel als Abhängigkeit des Ziels
ResolveCurrentProjectStaticWebAssets
hinzu, indem Sie das folgende Ziel in einer Eigenschaftengruppe (PropertyGroup
) in der Projektdatei hinzufügen:<ResolveCurrentProjectStaticWebAssetsInputsDependsOn> CompileTypeScript; $(ResolveCurrentProjectStaticWebAssetsInputs) </ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
Inhalte aus einer RCL, auf die verwiesen wird, verwenden
Die Dateien im Ordner wwwroot
der RCL werden entweder für die RCL oder für die verwendende App unter dem Präfix _content/{PACKAGE ID}/
verfügbar gemacht. Beispielsweise führt eine Bibliothek mit dem Assemblynamen Razor.Class.Lib
, bei der <PackageId>
nicht in der Projektdatei angegeben wird, zu einem Pfad zu statischem Inhalt unter _content/Razor.Class.Lib/
. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID.
Die verwendende App verweist auf statische Objekte, die von der Bibliothek bereitgestellt werden, mit <script>
, <style>
, <img>
und anderen HTML-Tags. Bei der verwendenden App muss static file support (Unterstützung von statischen Dateien) in Startup.Configure
aktiviert sein:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseStaticFiles();
...
}
Beim Ausführen der verwendenden App in der Buildausgabe (dotnet run
) sind statische Webobjekte in der Entwicklungsumgebung standardmäßig aktiviert. Wenn beim Ausführen in der Buildausgabe Objekte in anderen Umgebungen unterstützt werden sollen, rufen Sie UseStaticWebAssets
im Host-Generator in Program.cs
auf:
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>();
});
}
UseStaticWebAssets
muss nicht aufgerufen werden, wenn eine App in der veröffentlichten Ausgabe ausgeführt wird (dotnet publish
).
Entwicklungsablauf bei mehreren Projekten
Wenn die verwendende App ausgeführt wird:
- bleiben die Objekte in der RCL in ihren ursprünglichen Ordnern. werden die Objekte nicht in die verwendende App verschoben.
- Änderungen im Ordner
wwwroot
der RCL werden in der verwendenden App abgebildet, sobald die RCL neu erstellt wurde, ohne dass die verwendende App neu erstellt werden muss.
Wenn die RCL erstellt wird, wird ein Manifest erstellt, in dem die Speicherorte der statischen Webobjekte stehen. Die verwendende App liest das Manifest zur Laufzeit, um die Objekte aus den Projekten und Paketen, auf die verwiesen wird, zu verwenden. Wenn ein neues Objekt zu einer RCL hinzugefügt wird, muss die RCL neu erstellt werden, um das Manifest zu aktualisieren, damit verwendende Apps auf das neue Objekt zugreifen können.
Veröffentlichen
Wenn die App veröffentlicht wird, werden die Begleitobjekte aus allen Projekten und Paketen, auf die verwiesen wird, in den Ordner wwwroot
der veröffentlichten App unter _content/{PACKAGE ID}/
kopiert. Wenn Sie ein NuGet-Paket erstellen und der Assemblyname nicht mit der Paket-ID identisch ist (<PackageId>
in der Projektdatei der Bibliothek), verwenden Sie die in der Projektdatei für {PACKAGE ID}
angegebene Paket-ID, wenn Sie den Ordner wwwroot
für die veröffentlichten Ressourcen untersuchen.