ASP.NET Core Razor Pages View Components

2024-07-26

筆記 ASP.NET Core 開發 Razor Pages 使用 View Components 的方法以及與 Partial Views 的差異。

logo

說明

Microsoft 提到適合使用 View Components 的情境:

Dynamic navigation menus
Tag cloud, where it queries the database
Sign in panel
Shopping cart
Recently published articles
Sidebar content on a blog

View Components 相較於 Partial Views 的優勢在於可以提供更多的邏輯處理,使用 Dependency Injection 搭配服務以及 Model Binding 來接收參數。

Usage

要使用 View Components 需要建立 ViewComponents 資料夾,並在裡面建立 View Components 的類別,並繼承 ViewComponent 類別。

另外 View 要放置在 Views/Shared/Components/{ViewComponentName}/Default.cshtml 當中。

View Components 類別中的 InvokeAsyncInvoke 方法會回傳 IViewComponentResult 類別,可以使用 View 方法回傳 View。

/ViewComponents/CourseNotes.cs

namespace CourseHelper.ViewComponents;

public class CourseNotesViewComponent : ViewComponent
{
    public IViewComponentResult Invoke(int Count = 2)
    {
        var news = new List<string>
        {
            "News 1: Top story of the day!",
            "News 2: Major event happening now!",
            "News 3: Important update for everyone!"
        };

        return View(news.Take(Count));
    }
}

/Pages/Shared/Components/CourseNote.cshtml

@model IEnumerable<string>

<div>
    <h2>Latest News</h2>
    <ul>
        @foreach (var item in Model)
        {
            <li>@item</li>
        }
    </ul>
</div>

要在 Razor Pages 中使用 View Components 可以使用 Component.InvokeAsyncComponent.Invoke 方法。

@(await Component.InvokeAsync("CourseNotes", new { Count = 1}))

或可以使用 Tag Helper 的方式,必須先在 _ViewImports.cshtml 中加入 View Components 的命名空間。

例如 namespace CourseHelper.ViewComponents,可以在 _ViewImports.cshtml 中加入:

@addTagHelper *, CourseHelper

⭐ 在使用上要注意 Tag Helper 必須使用 kebab-case 的元件名稱 (例如 CourseNotes 要轉換為 course-notes) 以及 lower-case 的參數名稱。

<vc:course-notes count="1" />

Ajax Usage

ViewComponents 扮演能夠重複使用的元件,可以在多個 Razor Pages 中使用。但如果要將資料 Submit 必須搭配 Page 的 OnPost 來達成,沒辦法單純透過 ViewComponent。

例如想要一個 Panel 來讓使用者輸入資料,並且在使用者完成輸入後要自動更新 Panel 的內容,這個時候就必須將 View Component 與 Page Handler 進行結合使用。

相關連結

View Components in Razor Pages | Learn Razor Pages