ASP.NET Core MVC 之視圖元件(View Component)
1.視圖元件介紹
視圖元件是 ASP.NET Core MVC 的新特性,類似于局部視圖,但它更強大。視圖元件不使用模型綁定,并且僅依賴于調用它時所提供的資料。
視圖元件特點:
呈塊狀,而不是整個響應
包括在控制器和視圖之間發現的相同的關注點和可測試性優點
可以擁有參數和業務邏輯
通常從布局頁面調用
視圖元件可以用在任何需要重複邏輯且對局部視圖來說過于複雜的情況,例如:
動态導航菜單
标簽雲(需要查詢資料庫)
登入面闆
購物車
最近發表的文章
典型部落格上的側邊欄内容
将在每個頁面上呈現的登入面闆,根據使用者的登入狀态顯示登出或者登入的連結
視圖元件有兩部分組成,類(通常派生自 ViewComponent)和它傳回的結果(通常是一個視圖)。與控制器一樣,視圖元件可以是POCO,但大多數是利用 ViewComponent 派生的方法和屬性。
2.建立視圖元件
(1)視圖元件類
一個視圖元件類通常可以通過以下任一方式建立:
派生自ViewComponent
使用 [ViewComponent] 屬性裝飾類,或從具有 [ViewComponent] 屬性的類派生
建立一個名稱字尾為 ViewComponent 結尾的類
像控制器一樣,視圖元件必須是 public ,非嵌套和非抽象類。視圖元件名稱是删除了 ViewComponent 字尾的類名,可以使用 ViewComponentAttribute.Name 屬性顯示指定。
視圖元件類優點:
完全支援構造函數依賴注入
不參與控制器生命周期,這意味着不能在視圖元件中使用過濾器
(2) 視圖元件方法
視圖元件在 InvokeAsync 方法中定義其邏輯,并傳回 IViewComponentResult 。參數直接來自視圖元件的調用,而不是來自模型綁定。視圖元件從不直接處理請求。通常,視圖元件通過調用 View 方法初始化模型并将其傳遞給視圖。總之,視圖元件有以下特點:
定義一個 InvokeAsync 方法并傳回 IViewComponentResult。
通常通過調用 ViewComponent View 方法初始化模型并将其傳遞給視圖。
參數來自調用方法,而不是 HTTP,沒有模型綁定。
不能直接作為 HTTP 端點通路,它是從你的代碼(通常在視圖中)調用的。視圖元件不處理請求。
在簽名上重載,而不是目前 HTTP 請求的任何細節。
(3) 視圖搜尋路徑
運作時在以下路徑搜尋視圖:
Views//Components//
Views/Shared/Components//
視圖元件的預設視圖名稱是 Default,這意味着你的視圖檔案通常名為 Default.cshtml。你可以在建立視圖元件結果或調用 View 方法時指定其他的視圖名稱。
3.調用視圖元件
要使用視圖元件,請從視圖中調用 @Component.InvokeAsync("視圖元件名稱",<匿名參數>)。參數将傳遞到 InvokeAsync 方法。如下:
@await Component.InvokeAsync("TopicRankList",new { days=5})
視圖元件通常從視圖中調用,但也可以從控制器方法中直接調用,雖然視圖元件不像控制器那樣定義終結點。
public ActionResult Index()
{
return ViewComponent("TopicRankList", new { days = 5 });
}
4.實戰視圖元件
添加一個 ViewCompoents 檔案夾,然後添加 UserRankList類:
複制代碼
public class UserRankList : ViewComponent
{
private readonly DataContext _db;
private IMemoryCache _memoryCache;
private string cacheKey = "topicrank";
public UserRankList(DataContext db, IMemoryCache memoryCache)
{
_db = db;
_memoryCache = memoryCache;
}
public IViewComponentResult Invoke(int days)
{
var items = new List<User>();
if (!_memoryCache.TryGetValue(cacheKey, out items))
{
items = GetRankUsers(10, days);
}
_memoryCache.Set(cacheKey,items,TimeSpan.FromMinutes(10));
return View(items);
}
private List<User> GetRankUsers(int top, int days)
{
return _db.User.OrderBy(o => o.Id).Take(top).ToList();
}
}
視圖元件類可以在項目的任何檔案夾中。 [ViewComponent] 特性可以更改用于引用視圖元件的名稱,例如,可以命名類為 XYZ,并應用 [ViewComponent] 特性:
[ViewComponent(Name="UserRankTop")]
public calss XYZ:ViewComponent
Invoke 方法傳回清單,然後建立視圖元件視圖。
建立 View/Shared/Components 檔案夾。這個檔案夾必須名為 Components。然後在裡面建立 UserRankList 檔案夾,添加 Default.cshtml 視圖:
@model List
user
@foreach (var item in Model)
{
<label>@item.Name</label>
}
最後在視圖中調用:@await Component.InvokeAsync("UserRankList", new { days=5})
原文位址
https://www.cnblogs.com/afei-24/p/11317885.html