解讀ASP.NET 5 & MVC6系列教程(14):View Component
在之前的MVC中,我們經(jīng)常需要類似一種小部件的功能,通常我們都是使用Partial View來實現(xiàn),因為MVC中沒有類似Web Forms中的WebControl的功能。但在MVC6中,這一功能得到了極大的改善。新版MVC6中,提供了一種叫做View Component的功能。
你可以將View Component看做是一個mini的Controller——它只負責渲染一小部分內(nèi)容,而非全部響應(yīng),所有Partial View能解決的問題,你都可以使用View Component來解決,比如:動態(tài)導(dǎo)航菜單、Tag標簽、登錄窗口、購物車、最近閱讀文章等等。
View Component包含2個部分,一部分是類(繼承于ViewComponent),另外一個是Razor視圖(和普通的View視圖一樣)。就像新版MVC中的Controller一樣,ViewComponent也可以使POCO的(即不繼承ViewComponent類,但類名以ViewComponent結(jié)尾)。
View Component的創(chuàng)建
目前,View Component類的創(chuàng)建方式有如下三種:
直接繼承于ViewComponent給類加上ViewComponent特性,或繼承于帶有ViewComponent特性的類創(chuàng)建一個類,類名以ViewComponent結(jié)尾
和Controller一樣,View Component必須是public的,不能嵌套,不能是抽象類。
舉例來說,我們創(chuàng)建一個View Component,類名為TopListViewComponent,代碼如下:
public class TopListViewComponent : ViewComponent
{
private readonly ApplicationDbContext db;
public TopListViewComponent(ApplicationDbContext context)
{
db = context;
}
public IViewComponentResult Invoke(int categoryId, int topN)
{
List<string> col = new List<string>();
var items = db.TodoItems.Where(x => x.IsDone == false &&
x.categoryId == categoryId).Take(topN);
return View(items);
}
}
上述類,也可以定義成如下這樣:
[ViewComponent(Name = "TopList")]
public class TopWidget
{
// 其它類似
}
通過在TopWidget類上定義一個名稱為TopList的ViewComponent特性,其效果和定義TopListViewComponent類一樣,系統(tǒng)在查找的時候,都會認可,并且在其構(gòu)造函數(shù)中通過依賴注入功能提示構(gòu)造函數(shù)中參數(shù)的類型實例。
Invoke方法是一個約定方法,可以傳入任意數(shù)量的參數(shù),系統(tǒng)也支持InvokeAsync方法實現(xiàn)異步功能。
View Component的視圖文件創(chuàng)建
以在ProductController的視圖里調(diào)用View Component為例,我們需要在Views\Product文件夾下創(chuàng)建一個名稱為Components的文件夾(該文件夾名稱必須為Components)。
然后在Views\Product\Components文件夾下創(chuàng)建一個名稱為TopList 的文件夾(該文件夾名稱必須和View Component名稱一致,即必須是TopList)。
在Views\Product\Components\TopList文件夾下,創(chuàng)建一個Default.cshtml視圖文件,并添加如下標記:
@model IEnumerable<BookStore.Models.ProductItem>
<h3>Top Products</h3>
<ul>
@foreach (var todo in Model)
{
<li>@todo.Title</li>
}
</ul>
如果再View Component中,沒有指定視圖的名稱,將默認為Default.cshtml視圖。
至此,該View Component就創(chuàng)建好了,你可以在Views\Product\index.cshtml視圖中的任意位置調(diào)用該View Component,比如:
<div class="col-md-4">
@Component.Invoke("TopList", 1, 10)
</div>
如果在上述TopListViewComponent中定義的是異步方法InvokeAsync的話,則可以使用@await Component.InvokeAsync()方法來調(diào)用,這兩個方法的第一個參數(shù)都是TopListViewComponent的名稱,剩余的參數(shù)則是在TopListViewComponent類中定義的方法參數(shù)。
注意:一般來說,View Component的視圖文件都是添加在Views\Shared文件夾的,因為一般來說ViewComponent不會特定于某個Controller。
使用自定義視圖文件
一般來說,如果要使用自定義文件,我們需要在Invoke的方法返回返回值的時候來指定視圖的名稱,示例如下:
return View("TopN", items);
那么,就需要創(chuàng)建一個Views\Product\Components\TopN.cshtml文件,而使用的時候則無需更改,還是指定原來的View Component名稱即可,比如:
@await Component.InvokeAsync("TopList", 1, 10) //以異步調(diào)用為例
總結(jié)
一般來說,建議在通用的功能上使用View Component的功能,這樣所有的視圖文件都可以放在Views\Shared文件夾了。
相關(guān)文章
在ASP.NET 2.0中操作數(shù)據(jù)之六十四:GridView批量添加數(shù)據(jù)
前面介紹了批量更新,批量刪除數(shù)據(jù),這篇文章主要介紹如何實現(xiàn)批量添加數(shù)據(jù),當然為了保證數(shù)據(jù)的完整性,我們在做這些批量操作的時候,都使用了事務(wù)來實現(xiàn)。2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之二:創(chuàng)建一個業(yè)務(wù)邏輯層
本文主要介紹 ASP.NET 2.0 如何創(chuàng)建業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層主要定義一些業(yè)務(wù)規(guī)則,調(diào)用已經(jīng)定義好的數(shù)據(jù)庫訪問層代碼,將讀取、插入、修改以及刪除等方法應(yīng)用到合適的業(yè)務(wù)規(guī)則中。2016-04-04
在ASP.NET 2.0中操作數(shù)據(jù)之七十四:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(下部分)
本文接著上篇主要講如何使用Managed Code創(chuàng)建用戶自定義函數(shù),Visual Studio的SQL Server Project類型可以很容易的創(chuàng)建、編譯、配置managed database objects,此外還支持多種調(diào)試.2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之六十六:在TableAdapters中使用現(xiàn)有的存儲過程
雖然通過TableAdapter向?qū)Э梢宰詣拥纳纱鎯^程,但是在某些時候我們需要使用現(xiàn)有的存儲過程。本文將講解如何在Visual Studio環(huán)境里手動添加存儲過程,并引導(dǎo)TableAdapter的方法使用這些存儲過程。2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之三十八:處理BLL和DAL的異常
本文主要介紹如何在BLL和DAL層如何處理異常,以達到給用戶顯示友好的錯誤信息。2016-05-05
.Net?Core服務(wù)治理Consul使用服務(wù)發(fā)現(xiàn)
Consul是HashiCorp公司推出的開源工具,Consul由Go語言開發(fā),部署起來非常容易,只需要極少的可執(zhí)行程序和配置文件,具有綠色、輕量級的特點。Consul是分布式的、高可用的、?可橫向擴展的用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置2022-01-01
.NET應(yīng)用程序集DLL與EXE工作機制及原理介紹
這篇文章介紹了.NET應(yīng)用程序集DLL與EXE工作機制及原理,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2022-02-02
在ASP.NET 2.0中操作數(shù)據(jù)之五十七:在分層架構(gòu)中緩存數(shù)據(jù)
上一篇文章我們介紹了ASP.NET 2.0中使用ObjectDataSource在視圖層緩存數(shù)據(jù),缺點是不言而喻的,為了達到低耦合,本文介紹如何在三層架構(gòu)中使用緩存技術(shù)來緩存數(shù)據(jù)。2016-05-05

