Bagikan melalui


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

Oleh Rick Anderson

Razor tampilan, halaman, pengendali, 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 dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas.

Untuk informasi tentang cara mengintegrasikan npm dan webpack ke dalam proses build untuk RCL, lihat Bangun aset web klien untuk Razor Class Library Anda.

Buatlah 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 bantuan dan tampilan jika Anda memerlukan pustaka untuk berisi halaman dan/atau tampilan. Secara default, hanya Razor komponen yang didukung. Pilih Buat.

Templat Pustaka Kelas Razor secara otomatis digunakan untuk pengembangan komponen Razor. 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.

Referensi konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas. 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 untuk menguji urutan.

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

Jika RCL menggunakan Razor Halaman, aktifkan layanan dan titik akhir Razor Halaman 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>

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

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi yang menggunakan 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.

Gunakan perintah dotnet pack daripada versi NuGet.exe nuget pack.

Menambahkan aset web klien ke proses build

Mengintegrasikan aset web klien ke dalam alur build bersifat nontrivial. Lihat Bangun aset web klien untuk Razor Perpustakaan Kelas Anda untuk informasi lebih lanjut.

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:

  • Cantumkan paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Note

    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.

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

  • Tambahkan markup berikut ke file proyek:

    • Konfigurasikan output build TypeScript untuk folder wwwroot dengan properti TypescriptOutDir.
    • Jadikan target TypeScript sebagai dependensi dari target PrepareForBuildDependsOn.
    • Hapus output di wwwroot folder.
<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>

Mengonsumsi konten dari RCL yang dirujuk

File yang terdapat dalam folder wwwroot di RCL diekspos ke RCL atau aplikasi yang menggunakan dengan awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama rakitan Razor.Class.Lib dan tanpa <PackageId> yang ditentukan dalam file proyeknya menghasilkan jalur menuju konten statis di _content/Razor.Class.Lib/. Ketika membuat paket NuGet dan nama rakitannya tidak cocok dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket yang ditentukan dalam file proyek untuk {PACKAGE ID}.

Aplikasi yang mengonsumsi mereferensikan aset statis yang disediakan oleh pustaka dengan <script>, <style>, <img>, dan tag HTML lainnya. Aplikasi yang mengonsumsi 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 hasil build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Agar aset didukung di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pada 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();

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

Alur pengembangan multi-proyek

Saat aplikasi yang digunakan dijalankan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi penerima.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi konsumen setelah RCL selesai dibangun ulang dan tanpa perlu membangun ulang aplikasi konsumen.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi pemakai membaca manifes saat runtime untuk memanfaatkan 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.

Publish

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 proyek {PACKAGE ID} saat memeriksa folder wwwroot untuk aset yang diterbitkan.

Sumber daya tambahan

Razor tampilan, halaman, pengendali, 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 dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas.

Untuk informasi tentang cara mengintegrasikan npm dan webpack ke dalam proses build untuk pustaka kelas Razor, lihat Bangun aset web klien untuk Razor pustaka kelas Anda.

Buatlah 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) secara standar untuk Razor pengembangan komponen. 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.

Referensi konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas. 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 untuk menguji urutan.

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

Jika RCL menggunakan Razor Halaman, aktifkan layanan dan titik akhir Razor Halaman 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>

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

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi yang menggunakan 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.

Gunakan perintah dotnet pack daripada versi NuGet.exe nuget pack.

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. Cantumkan paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Note

    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 keluaran build TypeScript untuk direktori wwwroot. Atur properti TypescriptOutDir di dalam PropertyGroup berkas proyek:

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

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

Mengonsumsi konten dari RCL yang dirujuk

File yang terdapat dalam folder wwwroot di RCL diekspos ke RCL atau aplikasi yang menggunakan dengan awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama rakitan Razor.Class.Lib dan tanpa <PackageId> yang ditentukan dalam file proyeknya menghasilkan jalur menuju konten statis di _content/Razor.Class.Lib/. Ketika membuat paket NuGet dan nama rakitannya tidak cocok dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket yang ditentukan dalam file proyek untuk {PACKAGE ID}.

Aplikasi yang mengonsumsi mereferensikan aset statis yang disediakan oleh pustaka dengan <script>, <style>, <img>, dan tag HTML lainnya. Aplikasi yang mengonsumsi 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 hasil build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Agar aset didukung di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pada 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.

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

Alur pengembangan multi-proyek

Saat aplikasi yang digunakan dijalankan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi penerima.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi konsumen setelah RCL selesai dibangun ulang dan tanpa perlu membangun ulang aplikasi konsumen.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi pemakai membaca manifes saat runtime untuk memanfaatkan 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.

Publish

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 proyek {PACKAGE ID} saat memeriksa folder wwwroot untuk aset yang diterbitkan.

Sumber daya tambahan

Razor tampilan, halaman, pengendali, 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 dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas.

Melihat atau mengunduh kode sampel (cara mengunduh)

Buatlah 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 ☑ Dukungan halaman dan tampilan untuk mengaktifkan dukungan tampilan. Secara default, hanya Razor komponen yang didukung. Pilih Buat.

Templat Razor pustaka kelas (RCL) secara default untuk pengembangan komponen. 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.

Referensi konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas. 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 untuk menguji urutan.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Bangun dan jalankan aplikasi untuk memverifikasi bahwa versi parsial dari aplikasi 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>

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

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi yang menggunakan 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.

Gunakan perintah dotnet pack daripada versi NuGet.exe nuget pack.

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. Cantumkan paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Note

    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 keluaran build TypeScript untuk direktori wwwroot. Atur properti TypescriptOutDir di dalam PropertyGroup berkas proyek:

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

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

Mengonsumsi konten dari RCL yang dirujuk

File yang terdapat dalam folder wwwroot di RCL diekspos ke RCL atau aplikasi yang menggunakan dengan awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama rakitan Razor.Class.Lib dan tanpa <PackageId> yang ditentukan dalam file proyeknya menghasilkan jalur menuju konten statis di _content/Razor.Class.Lib/. Ketika membuat paket NuGet dan nama rakitannya tidak cocok dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket yang ditentukan dalam file proyek untuk {PACKAGE ID}.

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

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

    app.UseStaticFiles();

    ...
}

Saat menjalankan aplikasi yang menggunakan hasil build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Agar aset didukung di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pada 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>();
            });
}

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

Alur pengembangan multi-proyek

Saat aplikasi yang digunakan dijalankan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi penerima.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi konsumen setelah RCL selesai dibangun ulang dan tanpa perlu membangun ulang aplikasi konsumen.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi pemakai membaca manifes saat runtime untuk memanfaatkan 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.

Publish

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 proyek {PACKAGE ID} saat memeriksa folder wwwroot untuk aset yang diterbitkan.

Sumber daya tambahan

Razor tampilan, halaman, pengendali, 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 dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas.

Melihat atau mengunduh kode sampel (cara mengunduh)

Buatlah pustaka kelas yang berisi Razor UI

  • Dari menu File di Visual Studio, pilih Baru>Proyek.
  • 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.
  • Pastikan ASP.NET Core 2.1 atau yang lebih baru telah 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.

Referensi konten RCL

RCL dapat dirujuk dengan:

Langkah-langkah: Membuat proyek RCL dan menggunakannya dari 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 sudah selesai dan lebih suka membuat proyek panduan langkah demi langkah, lewati ke bagian berikutnya.

Buka file .sln di Visual Studio. Jalankan aplikasi.

Ikuti petunjuk di Uji WebApp1

Membuat RCL

Di bagian ini, sebuah RCL dibuat. Razor berkas ditambahkan ke RCL.

Buat proyek RCL:

  • Dari menu File di Visual Studio, pilih Baru>Proyek.
  • Pilih ASP.NET Core Web Application.
  • Beri nama aplikasi RazorUIClassLib>OK.
  • Pastikan ASP.NET Core 2.1 atau yang lebih baru telah 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 dalam RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml dengan kode berikut:

    <h3>_Message.cshtml partial view.</h3>
    
    <p>RazorUIClassLib\Areas\MyFeature\Pages\Shared\_Message.cshtml</p>
    
  • Ganti markup dalam RazorUIClassLib/Areas/MyFeature/Pages/Page1.cshtml dengan 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 .

Gunakan pustaka UI dari proyek Razor Pages Razor

Razor Buat aplikasi web Pages:

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

  • Pilih ASP.NET Core Web Application.

  • Beri nama aplikasi WebApp1.

  • Pastikan ASP.NET Core 2.1 atau yang lebih baru telah dipilih.

  • Pilih Aplikasi Web>OK.

  • Dari Penjelajah Solusi, klik kanan pada WebApp1 dan pilih Setel sebagai Proyek Startup.

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

  • Pastikan RazorUIClassLib sebagai dependensi WebApp1.

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

  • Dalam dialog Manajer Referensi, periksa RazorUIClassLib>OK.

Jalankan aplikasi.

Uji WebApp1

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

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas. 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 untuk menguji urutan.

RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml Salin tampilan parsial ke WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml. Perbarui markup untuk menunjukkan lokasi baru. Bangun dan jalankan aplikasi untuk memverifikasi bahwa versi parsial dari aplikasi 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, pengendali, 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 dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas.

Melihat atau mengunduh kode sampel (cara mengunduh)

Buatlah 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) secara default untuk pengembangan komponen. 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.

Referensi konten RCL

RCL dapat dirujuk dengan:

Mengganti tampilan, tampilan parsial, dan halaman

Saat tampilan, tampilan parsial, atau Razor Halaman dijumpai di aplikasi web dan RCL, Razor markup (.cshtml file) di aplikasi web memiliki prioritas. 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 untuk menguji urutan.

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

Jika RCL menggunakan Razor Halaman, aktifkan layanan dan titik akhir Razor Halaman 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>

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

@{
    Layout = "_Layout";
}

Membuat RCL dengan aset statis

RCL mungkin memerlukan aset statis pendamping yang dapat direferensikan oleh RCL atau aplikasi yang menggunakan 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.

Gunakan perintah dotnet pack daripada versi NuGet.exe nuget pack.

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. Cantumkan paket Microsoft.TypeScript.MSBuild NuGet dalam proyek.

    Note

    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 keluaran build TypeScript untuk direktori wwwroot. Atur properti TypescriptOutDir di dalam PropertyGroup berkas proyek:

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

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

Mengonsumsi konten dari RCL yang dirujuk

File yang terdapat dalam folder wwwroot di RCL diekspos ke RCL atau aplikasi yang menggunakan dengan awalan _content/{PACKAGE ID}/. Misalnya, pustaka dengan nama rakitan Razor.Class.Lib dan tanpa <PackageId> yang ditentukan dalam file proyeknya menghasilkan jalur menuju konten statis di _content/Razor.Class.Lib/. Ketika membuat paket NuGet dan nama rakitannya tidak cocok dengan ID paket (<PackageId> dalam file proyek pustaka), gunakan ID paket yang ditentukan dalam file proyek untuk {PACKAGE ID}.

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

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

    app.UseStaticFiles();

    ...
}

Saat menjalankan aplikasi yang menggunakan hasil build (dotnet run), aset web statis diaktifkan secara default di lingkungan Pengembangan. Agar aset didukung di lingkungan lain saat menjalankan dari output build, panggil UseStaticWebAssets pada 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>();
            });
}

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

Alur pengembangan multi-proyek

Saat aplikasi yang digunakan dijalankan:

  • Aset dalam RCL tetap berada di folder aslinya. Aset tidak dipindahkan ke aplikasi penerima.
  • Setiap perubahan dalam folder RCL wwwroot tercermin dalam aplikasi konsumen setelah RCL selesai dibangun ulang dan tanpa perlu membangun ulang aplikasi konsumen.

Saat RCL dibuat, manifes diproduksi yang menjelaskan lokasi aset web statis. Aplikasi pemakai membaca manifes saat runtime untuk memanfaatkan 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.

Publish

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 proyek {PACKAGE ID} saat memeriksa folder wwwroot untuk aset yang diterbitkan.

Sumber daya tambahan