Membuat UI yang dapat digunakan kembali menggunakan Razor proyek pustaka kelas di ASP.NET Core

Oleh Rick Anderson

Razor tampilan, halaman, pengontrol, model halaman, Razor komponen, Komponen tampilan, dan model data dapat dibangun ke dalam Razor pustaka kelas (RCL). RCL dapat dikemas dan digunakan kembali. Aplikasi dapat menyertakan RCL dan mengambil alih tampilan dan halaman yang dikandungnya. Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan.

Untuk informasi tentang cara mengintegrasikan npm dan webpack ke dalam proses build untuk Razor Pustaka Kelas, lihat Membangun aset web klien untuk Pustaka Kelas AndaRazor.

Membuat pustaka kelas yang berisi Razor UI

  • Dari Visual Studio pilih Buat proyek baru.
  • Pilih Razor Pustaka>Kelas Berikutnya.
  • Beri nama pustaka (misalnya, "RazorClassLib"), >Buat. Untuk menghindari tabrakan nama file dengan pustaka tampilan yang dihasilkan, pastikan nama pustaka tidak berakhiran .Views.
  • Pilih Halaman dukungan dan tampilan jika Anda memerlukan pustaka untuk berisi halaman dan/atau tampilan. Secara default, hanya Razor komponen yang didukung. Pilih Buat.

Templat Razor pustaka kelas (RCL) default ke Razor pengembangan komponen secara default. Opsi Halaman dukungan dan tampilan mendukung halaman dan tampilan. Untuk informasi selengkapnya tentang dukungan RCL di Blazor, lihat Menggunakan komponen ASP.NET Core Razor dari Razor pustaka kelas (RCL).

Tambahkan Razor file ke RCL.

Templat ASP.NET Core mengasumsikan konten RCL ada di Areas folder . Lihat tata letak Halaman RCL di bawah ini untuk membuat RCL yang mengekspos konten ~/Pages , bukan ~/Areas/Pages.

Mereferensikan konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan. Misalnya, tambahkan WebApp1/Areas/MyFeature/Pages/Page1.cshtml ke WebApp1, dan Page1 di WebApp1 akan lebih diutamakan daripada Page1 di RCL.

Dalam unduhan sampel, ganti nama WebApp1/Areas/MyFeature2 menjadi WebApp1/Areas/MyFeature prioritas pengujian.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Buat dan jalankan aplikasi untuk memverifikasi versi aplikasi dari sebagian sedang digunakan.

Jika RCL menggunakan Razor Halaman, aktifkan Razor layanan Halaman dan titik akhir di aplikasi hosting:

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();

Tata letak Halaman RCL

Untuk mereferensikan konten RCL seolah-olah itu adalah bagian dari folder aplikasi Pages web, buat proyek RCL dengan struktur file berikut:

  • RazorUIClassLib/Pages
  • RazorUIClassLib/Pages/Shared

Misalkan RazorUIClassLib/Pages/Shared berisi dua file parsial: _Header.cshtml dan _Footer.cshtml. Tag <partial> dapat ditambahkan ke _Layout.cshtml file:

<body>
  <partial name="_Header">
  @RenderBody()
  <partial name="_Footer">
</body>

_ViewStart.cshtml Tambahkan file ke folder proyek Pages RCL untuk menggunakan _Layout.cshtml file dari aplikasi web host:

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi penggunaan RCL. ASP.NET Core memungkinkan pembuatan RCL yang menyertakan aset statis yang tersedia untuk aplikasi yang mengonsumsi.

Untuk menyertakan aset pendamping sebagai bagian dari RCL, buat wwwroot folder di pustaka kelas dan sertakan file yang diperlukan dalam folder tersebut.

Saat mengemas RCL, semua aset pendamping dalam wwwroot folder secara otomatis disertakan dalam paket.

dotnet pack Gunakan perintah daripada versi nuget packNuGet.exe .

Menambahkan aset web klien ke proses build

Mengintegrasikan aset web klien ke dalam alur build bersifat nontrivial. Lihat Membangun aset web klien untuk Pustaka Kelas Anda Razor untuk informasi selengkapnya.

Mengecualikan aset statis

Untuk mengecualikan aset statis, tambahkan jalur pengecualian yang diinginkan ke $(DefaultItemExcludes) grup properti dalam file proyek. Pisahkan entri dengan titik koma (;).

Dalam contoh berikut, lib.css lembar gaya di wwwroot folder tidak dianggap sebagai aset statis dan tidak disertakan dalam RCL yang diterbitkan:

<PropertyGroup>
  <DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>

Integrasi typescript

Untuk menyertakan file TypeScript dalam RCL:

  1. Referensi paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Catatan

    Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.

  2. Tempatkan file TypeScript (.ts) di luar wwwroot folder. Misalnya, tempatkan file dalam Client folder.

  3. Konfigurasikan output build TypeScript untuk wwwroot folder . Atur properti di TypescriptOutDir dalam PropertyGroup file proyek:

    <TypescriptOutDir>wwwroot</TypescriptOutDir>
    
  4. Sertakan target TypeScript sebagai dependensi PrepareForBuildDependsOn target dengan menambahkan target berikut di dalam PropertyGroup file proyek:

    <PrepareForBuildDependsOn>
      CompileTypeScript;
      GetTypeScriptOutputForPublishing;$(PrepareForBuildDependsOn)
    </PrepareForBuildDependsOn>
    

Menggunakan konten dari RCL yang dirujuk

File yang disertakan dalam wwwroot folder RCL diekspos ke RCL atau aplikasi yang mengkonsumsi di bawah awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama Razor.Class.Lib rakitan dan tanpa <PackageId> ditentukan dalam file proyeknya menghasilkan jalur ke konten statis di _content/Razor.Class.Lib/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file proyek untuk {PACKAGE ID}.

Aplikasi yang menggunakan mereferensikan aset statis yang disediakan oleh pustaka dengan <script>, <style>, <img>, dan tag HTML lainnya. Aplikasi yang menggunakan harus mengaktifkan dukungan file statis di:

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();

Saat menjalankan aplikasi yang menggunakan dari output build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Untuk mendukung aset di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pembangun host di Program.cs:

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 Panggilan tidak diperlukan saat menjalankan aplikasi dari output yang diterbitkan (dotnet publish).

Alur pengembangan multi-proyek

Saat aplikasi yang mengonsumsi berjalan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi yang mengonsumsi.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi yang mengkonsumsi setelah RCL dibangun kembali dan tanpa membangun kembali aplikasi yang mengkonsumsi.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi yang menggunakan membaca manifes pada runtime untuk menggunakan aset dari proyek dan paket yang dirujuk. Saat aset baru ditambahkan ke RCL, RCL harus dibangun kembali untuk memperbarui manifesnya sebelum aplikasi yang menggunakan dapat mengakses aset baru.

Terbitkan

Saat aplikasi diterbitkan, aset pendamping dari semua proyek dan paket yang direferensikan disalin ke dalam wwwroot folder aplikasi yang diterbitkan di bawah _content/{PACKAGE ID}/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file {PACKAGE ID} proyek saat memeriksa wwwroot folder untuk aset yang diterbitkan.

Sumber Daya Tambahan:

Razor tampilan, halaman, pengontrol, model halaman, Razor komponen, Komponen tampilan, dan model data dapat dibangun ke dalam Razor pustaka kelas (RCL). RCL dapat dikemas dan digunakan kembali. Aplikasi dapat menyertakan RCL dan mengambil alih tampilan dan halaman yang dikandungnya. Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan.

Untuk informasi tentang cara mengintegrasikan npm dan webpack ke dalam proses build untuk Razor Pustaka Kelas, lihat Membangun aset web klien untuk Pustaka Kelas AndaRazor.

Membuat pustaka kelas yang berisi Razor UI

  • Dari Visual Studio pilih Buat proyek baru.
  • Pilih Razor Pustaka>Kelas Berikutnya.
  • Beri nama pustaka (misalnya, "RazorClassLib"), >Buat. Untuk menghindari tabrakan nama file dengan pustaka tampilan yang dihasilkan, pastikan nama pustaka tidak berakhiran .Views.
  • Pilih Halaman dukungan dan tampilan jika Anda perlu mendukung tampilan. Secara default, hanya Razor Halaman yang didukung. Pilih Buat.

Templat Razor pustaka kelas (RCL) default ke Razor pengembangan komponen secara default. Opsi Halaman dukungan dan tampilan mendukung halaman dan tampilan.

Tambahkan Razor file ke RCL.

Templat ASP.NET Core mengasumsikan konten RCL ada di Areas folder . Lihat tata letak Halaman RCL di bawah ini untuk membuat RCL yang mengekspos konten ~/Pages , bukan ~/Areas/Pages.

Mereferensikan konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan. Misalnya, tambahkan WebApp1/Areas/MyFeature/Pages/Page1.cshtml ke WebApp1, dan Page1 di WebApp1 akan lebih diutamakan daripada Page1 di RCL.

Dalam unduhan sampel, ganti nama WebApp1/Areas/MyFeature2 menjadi WebApp1/Areas/MyFeature prioritas pengujian.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Buat dan jalankan aplikasi untuk memverifikasi versi aplikasi dari sebagian sedang digunakan.

Jika RCL menggunakan Razor Halaman, aktifkan Razor layanan Halaman dan titik akhir di aplikasi hosting:

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();

Tata letak Halaman RCL

Untuk mereferensikan konten RCL seolah-olah itu adalah bagian dari folder aplikasi Pages web, buat proyek RCL dengan struktur file berikut:

  • RazorUIClassLib/Pages
  • RazorUIClassLib/Pages/Shared

Misalkan RazorUIClassLib/Pages/Shared berisi dua file parsial: _Header.cshtml dan _Footer.cshtml. Tag <partial> dapat ditambahkan ke _Layout.cshtml file:

<body>
  <partial name="_Header">
  @RenderBody()
  <partial name="_Footer">
</body>

_ViewStart.cshtml Tambahkan file ke folder proyek Pages RCL untuk menggunakan _Layout.cshtml file dari aplikasi web host:

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi penggunaan RCL. ASP.NET Core memungkinkan pembuatan RCL yang menyertakan aset statis yang tersedia untuk aplikasi yang mengonsumsi.

Untuk menyertakan aset pendamping sebagai bagian dari RCL, buat wwwroot folder di pustaka kelas dan sertakan file yang diperlukan dalam folder tersebut.

Saat mengemas RCL, semua aset pendamping dalam wwwroot folder secara otomatis disertakan dalam paket.

dotnet pack Gunakan perintah daripada versi nuget packNuGet.exe .

Mengecualikan aset statis

Untuk mengecualikan aset statis, tambahkan jalur pengecualian yang diinginkan ke $(DefaultItemExcludes) grup properti dalam file proyek. Pisahkan entri dengan titik koma (;).

Dalam contoh berikut, lib.css lembar gaya di wwwroot folder tidak dianggap sebagai aset statis dan tidak disertakan dalam RCL yang diterbitkan:

<PropertyGroup>
  <DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>

Integrasi typescript

Untuk menyertakan file TypeScript dalam RCL:

  1. Referensi paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Catatan

    Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.

  2. Tempatkan file TypeScript (.ts) di luar wwwroot folder. Misalnya, tempatkan file dalam Client folder.

  3. Konfigurasikan output build TypeScript untuk wwwroot folder . Atur properti di TypescriptOutDir dalam PropertyGroup file proyek:

    <TypescriptOutDir>wwwroot</TypescriptOutDir>
    
  4. Sertakan target TypeScript sebagai dependensi PrepareForBuildDependsOn target dengan menambahkan target berikut di dalam PropertyGroup file proyek:

    <PrepareForBuildDependsOn>
      CompileTypeScript;
      GetTypeScriptOutputForPublishing;$(PrepareForBuildDependsOn)
    </PrepareForBuildDependsOn>
    

Menggunakan konten dari RCL yang dirujuk

File yang disertakan dalam wwwroot folder RCL diekspos ke RCL atau aplikasi yang mengkonsumsi di bawah awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama Razor.Class.Lib rakitan dan tanpa <PackageId> ditentukan dalam file proyeknya menghasilkan jalur ke konten statis di _content/Razor.Class.Lib/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file proyek untuk {PACKAGE ID}.

Aplikasi yang menggunakan mereferensikan aset statis yang disediakan oleh pustaka dengan <script>, <style>, <img>, dan tag HTML lainnya. Aplikasi yang menggunakan harus mengaktifkan dukungan file statis di:

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();

Saat menjalankan aplikasi yang menggunakan dari output build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Untuk mendukung aset di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pembangun host di Program.cs:

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();

Catatan: .NET 6 hanya memerlukan panggilan builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets. Untuk informasi lebih lanjut, lihat masalah GitHub ini.

UseStaticWebAssets Panggilan tidak diperlukan saat menjalankan aplikasi dari output yang diterbitkan (dotnet publish).

Alur pengembangan multi-proyek

Saat aplikasi yang mengonsumsi berjalan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi yang mengonsumsi.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi yang mengkonsumsi setelah RCL dibangun kembali dan tanpa membangun kembali aplikasi yang mengkonsumsi.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi yang menggunakan membaca manifes pada runtime untuk menggunakan aset dari proyek dan paket yang dirujuk. Saat aset baru ditambahkan ke RCL, RCL harus dibangun kembali untuk memperbarui manifesnya sebelum aplikasi yang menggunakan dapat mengakses aset baru.

Terbitkan

Saat aplikasi diterbitkan, aset pendamping dari semua proyek dan paket yang direferensikan disalin ke dalam wwwroot folder aplikasi yang diterbitkan di bawah _content/{PACKAGE ID}/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file {PACKAGE ID} proyek saat memeriksa wwwroot folder untuk aset yang diterbitkan.

Sumber Daya Tambahan:

Razor tampilan, halaman, pengontrol, model halaman, Razor komponen, Komponen tampilan, dan model data dapat dibangun ke dalam Razor pustaka kelas (RCL). RCL dapat dikemas dan digunakan kembali. Aplikasi dapat menyertakan RCL dan mengambil alih tampilan dan halaman yang dikandungnya. Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan.

Melihat atau mengunduh kode sampel (cara mengunduh)

Membuat pustaka kelas yang berisi Razor UI

  • Dari Visual Studio pilih Buat proyek baru.
  • Pilih Razor Pustaka>Kelas Berikutnya.
  • Beri nama pustaka (misalnya, "RazorClassLib"),> Buat>Berikutnya. Untuk menghindari tabrakan nama file dengan pustaka tampilan yang dihasilkan, pastikan nama pustaka tidak berakhiran .Views.
  • Pilih Kerangka Kerja Target. Centang ☑ Halaman dukungan dan tampilan untuk mendukung tampilan. Secara default, hanya Razor komponen yang didukung. Pilih Buat.

Templat Razor pustaka kelas (RCL) default ke Razor pengembangan komponen secara default. Opsi Halaman dukungan dan tampilan mendukung halaman dan tampilan.

Tambahkan Razor file ke RCL.

Templat ASP.NET Core mengasumsikan konten RCL ada di Areas folder . Lihat Tata letak Halaman RCL untuk membuat RCL yang mengekspos konten ~/Pages , bukan ~/Areas/Pages.

Mereferensikan konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan. Misalnya, tambahkan WebApp1/Areas/MyFeature/Pages/Page1.cshtml ke WebApp1, dan Page1 di WebApp1 akan lebih diutamakan daripada Page1 di RCL.

Dalam unduhan sampel, ganti nama WebApp1/Areas/MyFeature2 menjadi WebApp1/Areas/MyFeature prioritas pengujian.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Buat dan jalankan aplikasi untuk memverifikasi versi aplikasi dari sebagian sedang digunakan.

Tata letak Halaman RCL

Untuk mereferensikan konten RCL seolah-olah itu adalah bagian dari folder aplikasi Pages web, buat proyek RCL dengan struktur file berikut:

  • RazorUIClassLib/Pages
  • RazorUIClassLib/Pages/Shared

Misalkan RazorUIClassLib/Pages/Shared berisi dua file parsial: _Header.cshtml dan _Footer.cshtml. Tag <partial> dapat ditambahkan ke _Layout.cshtml file:

<body>
  <partial name="_Header">
  @RenderBody()
  <partial name="_Footer">
</body>

_ViewStart.cshtml Tambahkan file ke folder proyek Pages RCL untuk menggunakan _Layout.cshtml file dari aplikasi web host:

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi penggunaan RCL. ASP.NET Core memungkinkan pembuatan RCL yang menyertakan aset statis yang tersedia untuk aplikasi yang mengonsumsi.

Untuk menyertakan aset pendamping sebagai bagian dari RCL, buat wwwroot folder di pustaka kelas dan sertakan file yang diperlukan dalam folder tersebut.

Saat mengemas RCL, semua aset pendamping dalam wwwroot folder secara otomatis disertakan dalam paket.

dotnet pack Gunakan perintah daripada versi nuget packNuGet.exe .

Mengecualikan aset statis

Untuk mengecualikan aset statis, tambahkan jalur pengecualian yang diinginkan ke $(DefaultItemExcludes) grup properti dalam file proyek. Pisahkan entri dengan titik koma (;).

Dalam contoh berikut, lib.css lembar gaya di wwwroot folder tidak dianggap sebagai aset statis dan tidak disertakan dalam RCL yang diterbitkan:

<PropertyGroup>
  <DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>

Integrasi typescript

Untuk menyertakan file TypeScript dalam RCL:

  1. Referensi paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Catatan

    Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.

  2. Tempatkan file TypeScript (.ts) di luar wwwroot folder. Misalnya, tempatkan file dalam Client folder.

  3. Konfigurasikan output build TypeScript untuk wwwroot folder . Atur properti di TypescriptOutDir dalam PropertyGroup file proyek:

    <TypescriptOutDir>wwwroot</TypescriptOutDir>
    
  4. Sertakan target TypeScript sebagai dependensi ResolveCurrentProjectStaticWebAssets target dengan menambahkan target berikut di dalam PropertyGroup file proyek:

    <ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
      CompileTypeScript;
      $(ResolveCurrentProjectStaticWebAssetsInputs)
    </ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
    

Menggunakan konten dari RCL yang dirujuk

File yang disertakan dalam wwwroot folder RCL diekspos ke RCL atau aplikasi yang mengkonsumsi di bawah awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama Razor.Class.Lib rakitan dan tanpa <PackageId> ditentukan dalam file proyeknya menghasilkan jalur ke konten statis di _content/Razor.Class.Lib/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file proyek untuk {PACKAGE ID}.

Aplikasi yang menggunakan mereferensikan aset statis yang disediakan oleh pustaka dengan <script>, <style>, <img>, dan tag HTML lainnya. Aplikasi yang menggunakan harus mengaktifkan dukungan file statis di Startup.Configure:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    app.UseStaticFiles();

    ...
}

Saat menjalankan aplikasi yang menggunakan dari output build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Untuk mendukung aset di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pembangun host di Program.cs:

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 Panggilan tidak diperlukan saat menjalankan aplikasi dari output yang diterbitkan (dotnet publish).

Alur pengembangan multi-proyek

Saat aplikasi yang mengonsumsi berjalan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi yang mengonsumsi.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi yang mengkonsumsi setelah RCL dibangun kembali dan tanpa membangun kembali aplikasi yang mengkonsumsi.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi yang menggunakan membaca manifes pada runtime untuk menggunakan aset dari proyek dan paket yang dirujuk. Saat aset baru ditambahkan ke RCL, RCL harus dibangun kembali untuk memperbarui manifesnya sebelum aplikasi yang menggunakan dapat mengakses aset baru.

Terbitkan

Saat aplikasi diterbitkan, aset pendamping dari semua proyek dan paket yang direferensikan disalin ke dalam wwwroot folder aplikasi yang diterbitkan di bawah _content/{PACKAGE ID}/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file {PACKAGE ID} proyek saat memeriksa wwwroot folder untuk aset yang diterbitkan.

Sumber Daya Tambahan:

Razor tampilan, halaman, pengontrol, model halaman, Razor komponen, Komponen tampilan, dan model data dapat dibangun ke dalam Razor pustaka kelas (RCL). RCL dapat dikemas dan digunakan kembali. Aplikasi dapat menyertakan RCL dan mengambil alih tampilan dan halaman yang dikandungnya. Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan.

Melihat atau mengunduh kode sampel (cara mengunduh)

Membuat pustaka kelas yang berisi Razor UI

  • Dari menu File Visual Studio, pilih Proyek Baru>.
  • Pilih ASP.NET Core Web Application.
  • Beri nama pustaka (misalnya, "RazorClassLib") >OK. Untuk menghindari tabrakan nama file dengan pustaka tampilan yang dihasilkan, pastikan nama pustaka tidak berakhiran .Views.
  • Verifikasi ASP.NET Core 2.1 atau yang lebih baru dipilih.
  • Pilih Razor Pustaka>Kelas OK.

RCL memiliki file proyek berikut:

<Project Sdk="Microsoft.NET.Sdk.Razor">

    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
    </PropertyGroup>

    <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
    </ItemGroup>


</Project>

Tambahkan Razor file ke RCL.

Templat ASP.NET Core mengasumsikan konten RCL ada di Areas folder . Lihat Tata letak Halaman RCL untuk membuat RCL yang mengekspos konten ~/Pages , bukan ~/Areas/Pages.

Mereferensikan konten RCL

RCL dapat dirujuk dengan:

Panduan: Membuat proyek RCL dan menggunakan dari Razor proyek Pages

Anda dapat mengunduh proyek lengkap dan mengujinya daripada membuatnya. Unduhan sampel berisi kode dan tautan tambahan yang membuat proyek mudah diuji. Anda dapat meninggalkan umpan balik dalam masalah GitHub ini dengan komentar Anda tentang sampel unduhan versus instruksi langkah demi langkah.

Menguji aplikasi unduhan

Jika Anda belum mengunduh aplikasi yang telah selesai dan lebih suka membuat proyek penelusuran, lewati ke bagian berikutnya.

Buka file .sln di Visual Studio. Jalankan aplikasi.

Ikuti petunjuk di Uji WebApp1

Membuat RCL

Di bagian ini, RCL dibuat. Razor file ditambahkan ke RCL.

Buat proyek RCL:

  • Dari menu File Visual Studio, pilih Proyek Baru>.
  • Pilih ASP.NET Core Web Application.
  • Beri nama aplikasi RazorUIClassLib>OK.
  • Verifikasi ASP.NET Core 2.1 atau yang lebih baru dipilih.
  • Pilih Razor Pustaka>Kelas OK.
  • Razor Tambahkan file tampilan parsial bernama RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml.

Menambahkan Razor file dan folder ke proyek

  • Ganti markup dengan RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml kode berikut:

    <h3>_Message.cshtml partial view.</h3>
    
    <p>RazorUIClassLib\Areas\MyFeature\Pages\Shared\_Message.cshtml</p>
    
  • Ganti markup dengan RazorUIClassLib/Areas/MyFeature/Pages/Page1.cshtml kode berikut:

    @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 diperlukan untuk menggunakan tampilan parsial (<partial name="_Message" />). Daripada menyertakan direktif @addTagHelper , Anda dapat menambahkan _ViewImports.cshtml file. Contohnya:

    dotnet new viewimports -o RazorUIClassLib/Areas/MyFeature/Pages
    

    Untuk informasi selengkapnya tentang _ViewImports.cshtml, lihat Mengimpor Direktif Bersama

  • Bangun pustaka kelas untuk memverifikasi tidak ada kesalahan kompilator:

    dotnet build RazorUIClassLib
    

Output build berisi RazorUIClassLib.dll dan RazorUIClassLib.Views.dll. RazorUIClassLib.Views.dll berisi konten yang dikompilasi Razor .

Razor Menggunakan pustaka UI dari Razor proyek Pages

Razor Buat aplikasi web Pages:

  • Dari Penjelajah Solusi, klik kanan solusi >Tambahkan>Proyek Baru.

  • Pilih ASP.NET Core Web Application.

  • Beri nama aplikasi WebApp1.

  • Verifikasi ASP.NET Core 2.1 atau yang lebih baru dipilih.

  • Pilih Aplikasi>Web OK.

  • Dari Penjelajah Solusi, klik kanan pada WebApp1 dan pilih Atur sebagai Proyek StartUp.

  • Dari Penjelajah Solusi, klik kanan pada WebApp1 dan pilih Bangun Dependensi Proyek Dependensi>.

  • Periksa RazorUIClassLib sebagai dependensi WebApp1.

  • Dari Penjelajah Solusi, klik kanan pada WebApp1 dan pilih Tambahkan>Referensi.

  • Dalam dialog Manajer Referensi, periksa RazorUIClassLib>OK.

Jalankan aplikasi.

Uji WebApp1

Telusuri untuk /MyFeature/Page1 memverifikasi bahwa Razor pustaka kelas UI sedang digunakan.

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan. Misalnya, tambahkan WebApp1/Areas/MyFeature/Pages/Page1.cshtml ke WebApp1, dan Page1 di WebApp1 akan lebih diutamakan daripada Page1 di RCL.

Dalam unduhan sampel, ganti nama WebApp1/Areas/MyFeature2 menjadi WebApp1/Areas/MyFeature prioritas pengujian.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Buat dan jalankan aplikasi untuk memverifikasi versi aplikasi dari sebagian sedang digunakan.

Tata letak Halaman RCL

Untuk mereferensikan konten RCL seolah-olah itu adalah bagian dari folder aplikasi Pages web, buat proyek RCL dengan struktur file berikut:

  • RazorUIClassLib/Pages
  • RazorUIClassLib/Pages/Shared

Misalkan RazorUIClassLib/Pages/Shared berisi dua file parsial: _Header.cshtml dan _Footer.cshtml. Tag <partial> dapat ditambahkan ke _Layout.cshtml file:

<body>
  <partial name="_Header">
  @RenderBody()
  <partial name="_Footer">
</body>

Razor tampilan, halaman, pengontrol, model halaman, Razor komponen, Komponen tampilan, dan model data dapat dibangun ke dalam Razor pustaka kelas (RCL). RCL dapat dikemas dan digunakan kembali. Aplikasi dapat menyertakan RCL dan mengambil alih tampilan dan halaman yang dikandungnya. Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan.

Melihat atau mengunduh kode sampel (cara mengunduh)

Membuat pustaka kelas yang berisi Razor UI

  • Dari Visual Studio pilih Buat proyek baru.
  • Pilih Razor Pustaka>Kelas Berikutnya.
  • Beri nama pustaka (misalnya, "RazorClassLib"), >Buat. Untuk menghindari tabrakan nama file dengan pustaka tampilan yang dihasilkan, pastikan nama pustaka tidak berakhiran .Views.
  • Pilih Halaman dukungan dan tampilan jika Anda perlu mendukung tampilan. Secara default, hanya Razor Halaman yang didukung. Pilih Buat.

Templat Razor pustaka kelas (RCL) default ke Razor pengembangan komponen secara default. Opsi Halaman dukungan dan tampilan mendukung halaman dan tampilan.

Tambahkan Razor file ke RCL.

Templat ASP.NET Core mengasumsikan konten RCL ada di Areas folder . Lihat tata letak Halaman RCL di bawah ini untuk membuat RCL yang mengekspos konten ~/Pages , bukan ~/Areas/Pages.

Mereferensikan konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman ditemukan di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web lebih diutamakan. Misalnya, tambahkan WebApp1/Areas/MyFeature/Pages/Page1.cshtml ke WebApp1, dan Page1 di WebApp1 akan lebih diutamakan daripada Page1 di RCL.

Dalam unduhan sampel, ganti nama WebApp1/Areas/MyFeature2 menjadi WebApp1/Areas/MyFeature prioritas pengujian.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Buat dan jalankan aplikasi untuk memverifikasi versi aplikasi dari sebagian sedang digunakan.

Jika RCL menggunakan Razor Halaman, aktifkan Razor layanan Halaman dan titik akhir di aplikasi hosting:

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();
    });
}

Tata letak Halaman RCL

Untuk mereferensikan konten RCL seolah-olah itu adalah bagian dari folder aplikasi Pages web, buat proyek RCL dengan struktur file berikut:

  • RazorUIClassLib/Pages
  • RazorUIClassLib/Pages/Shared

Misalkan RazorUIClassLib/Pages/Shared berisi dua file parsial: _Header.cshtml dan _Footer.cshtml. Tag <partial> dapat ditambahkan ke _Layout.cshtml file:

<body>
  <partial name="_Header">
  @RenderBody()
  <partial name="_Footer">
</body>

_ViewStart.cshtml Tambahkan file ke folder proyek Pages RCL untuk menggunakan _Layout.cshtml file dari aplikasi web host:

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi penggunaan RCL. ASP.NET Core memungkinkan pembuatan RCL yang menyertakan aset statis yang tersedia untuk aplikasi yang mengonsumsi.

Untuk menyertakan aset pendamping sebagai bagian dari RCL, buat wwwroot folder di pustaka kelas dan sertakan file yang diperlukan dalam folder tersebut.

Saat mengemas RCL, semua aset pendamping dalam wwwroot folder secara otomatis disertakan dalam paket.

dotnet pack Gunakan perintah daripada versi nuget packNuGet.exe .

Mengecualikan aset statis

Untuk mengecualikan aset statis, tambahkan jalur pengecualian yang diinginkan ke $(DefaultItemExcludes) grup properti dalam file proyek. Pisahkan entri dengan titik koma (;).

Dalam contoh berikut, lib.css lembar gaya di wwwroot folder tidak dianggap sebagai aset statis dan tidak disertakan dalam RCL yang diterbitkan:

<PropertyGroup>
  <DefaultItemExcludes>$(DefaultItemExcludes);wwwroot\lib.css</DefaultItemExcludes>
</PropertyGroup>

Integrasi typescript

Untuk menyertakan file TypeScript dalam RCL:

  1. Referensi paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Catatan

    Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.

  2. Tempatkan file TypeScript (.ts) di luar wwwroot folder. Misalnya, tempatkan file dalam Client folder.

  3. Konfigurasikan output build TypeScript untuk wwwroot folder . Atur properti di TypescriptOutDir dalam PropertyGroup file proyek:

    <TypescriptOutDir>wwwroot</TypescriptOutDir>
    
  4. Sertakan target TypeScript sebagai dependensi ResolveCurrentProjectStaticWebAssets target dengan menambahkan target berikut di dalam PropertyGroup file proyek:

    <ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
      CompileTypeScript;
      $(ResolveCurrentProjectStaticWebAssetsInputs)
    </ResolveCurrentProjectStaticWebAssetsInputsDependsOn>
    

Menggunakan konten dari RCL yang dirujuk

File yang disertakan dalam wwwroot folder RCL diekspos ke RCL atau aplikasi yang mengkonsumsi di bawah awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama Razor.Class.Lib rakitan dan tanpa <PackageId> ditentukan dalam file proyeknya menghasilkan jalur ke konten statis di _content/Razor.Class.Lib/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file proyek untuk {PACKAGE ID}.

Aplikasi yang menggunakan mereferensikan aset statis yang disediakan oleh pustaka dengan <script>, <style>, <img>, dan tag HTML lainnya. Aplikasi yang menggunakan harus mengaktifkan dukungan file statis di Startup.Configure:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    app.UseStaticFiles();

    ...
}

Saat menjalankan aplikasi yang menggunakan dari output build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Untuk mendukung aset di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pembangun host di Program.cs:

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 Panggilan tidak diperlukan saat menjalankan aplikasi dari output yang diterbitkan (dotnet publish).

Alur pengembangan multi-proyek

Saat aplikasi yang mengonsumsi berjalan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi yang mengonsumsi.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi yang mengkonsumsi setelah RCL dibangun kembali dan tanpa membangun kembali aplikasi yang mengkonsumsi.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi yang menggunakan membaca manifes pada runtime untuk menggunakan aset dari proyek dan paket yang dirujuk. Saat aset baru ditambahkan ke RCL, RCL harus dibangun kembali untuk memperbarui manifesnya sebelum aplikasi yang menggunakan dapat mengakses aset baru.

Terbitkan

Saat aplikasi diterbitkan, aset pendamping dari semua proyek dan paket yang direferensikan disalin ke dalam wwwroot folder aplikasi yang diterbitkan di bawah _content/{PACKAGE ID}/. Saat memproduksi paket NuGet dan nama rakitan tidak sama dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket seperti yang ditentukan dalam file {PACKAGE ID} proyek saat memeriksa wwwroot folder untuk aset yang diterbitkan.

Sumber Daya Tambahan: