您好,登錄后才能下訂單哦!
1,定義類派生自ViewComponent類
2,增加Task<IViewComponentResult> InvokeAsync方法
3,在InovkeAsync方法中增加邏輯,并返回視圖結(jié)果
4,在類上增加ViewComponent特性,可以標(biāo)注組件名稱:[ViewComponent(Name="組件名稱")]。這一步不是必需的。
具體實例:
1 2 3 4 5 6 7 8 | [ViewComponent(Name="templatetest")] public class TemplateViewComponent:ViewComponent { public async Task<IViewComponentResult> InvokeAsync() { return View("~/Views/test.cshtml"); } } |
另外,我們可以給InvokeAsync方法增加參數(shù),在調(diào)用組件的時候,可以傳遞數(shù)據(jù),如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [ViewComponent(Name ="Pager")] public class Pager: ViewComponent { public Task<IViewComponentResult> InvokeAsync(int page,int pagesize,int count) { ViewBag.PageIndex = page; ViewBag.PageSize = pagesize; int totalPage = count / pagesize; if (count%pagesize>0) { totalPage += 1; } ViewBag.PageTotal = totalPage; ViewBag.RecordCount = count; return Task.FromResult<IViewComponentResult>(View("~/Views/ViewComponets/Pager.cshtml")); } } |
視圖組件創(chuàng)建好后,在視圖上使用以下方法調(diào)用:
@await Component.InvokeAsync("組件名稱",參數(shù)對象)或者@await Component.InvokeAsync(typeof(組件),參數(shù)對象)
在asp.net core mvc 1.1版本中,又增加了一個新的特性,就是可以使用標(biāo)簽方式調(diào)用視圖組件,類似下列效果:
<vc:組件名稱 param1="" param2=""></vc:組件名稱>
這有什么好處?Component.Invoke是在視圖中使用C#代碼執(zhí)行視圖組件,而標(biāo)簽方式更貼近前端技術(shù),對前端開發(fā)人員來說更友好。另外一個就是我們實現(xiàn)一個在線模板編輯器也更加的方便。
要實現(xiàn)一個在線模板編輯器我們可以分幾步走:
第一步:先實現(xiàn)簡單修改視圖代碼,可以帶到我們需要的效果
第二步:提供在線的html代碼編輯器,直接在線編輯html代碼
第三步:提供組件配置窗口,可以配置對應(yīng)的參數(shù)
第四步:可視化的頁面編輯
以一個企業(yè)展示站點(diǎn)作為場景,來說一下實現(xiàn)思路:
一般一個企業(yè)展示網(wǎng)站主要用于企業(yè)信息宣傳使用,表現(xiàn)形式就是文章,網(wǎng)站首頁會包含很多內(nèi)容板塊,每個板塊有自己的一些特性,比如展示條數(shù),內(nèi)容來源,滾動顯示等。如下內(nèi)容設(shè)置
我們可以在控制器中根據(jù)需要獲取所需要的數(shù)據(jù),然后直接綁定到視圖上,但是如果客戶要求有變動,比如展示條數(shù)的變動,我們只能是修改代碼,重新發(fā)布,比較麻煩。所以我們可以把這些內(nèi)容塊做成一個一個的組件,然后在視圖上直接調(diào)用,假設(shè)我們定義組件叫ContentBlockViewComponent,具體邏輯如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [ViewComponent(Name="contentblock")] public class ContentBlockViewComponent:ViewComponent { /// <summary> /// 內(nèi)容展示組件 /// </summary> /// <param name="showCount">顯示條數(shù)</param> /// <param name="source">信息來源板塊</param> /// <returns></returns> public async Task<IViewComponentResult> InvokeAsync(int showCount,int source) { //TODO:根據(jù)參數(shù)從指定板塊獲取數(shù)據(jù) return View("~/Views/ContentBlock.cshtml"); } } |
然后我們在首頁視圖上使用<vc:contentblock showcount="6" source="1"/>展示內(nèi)容。當(dāng)參數(shù)發(fā)生改變時,我們可以直接在視圖上修改組件調(diào)用方法即可。到此我們實現(xiàn)了第一步:簡單修改代碼實現(xiàn)想要的效果。
這一步其實也很好實現(xiàn),直接在系統(tǒng)中增加一個在線html編輯器(使用codemirror),直接通過讀取視圖文件內(nèi)容,展示到前臺頁面上,根據(jù)需要修改代碼并提交保存。實現(xiàn)到這一步,對于最終用戶來說,還是需要掌握一定的html知識,所以一般比較難,只能提供給開發(fā)使用。
codemirror中有一個Tag Matcher組件,我們可以以這個為思路,實現(xiàn)一個標(biāo)簽選中事件,讀取當(dāng)前標(biāo)簽的一些信息,并在配置窗口中顯示對應(yīng)信息,這個的還沒具體實現(xiàn)。如果這部分可以實現(xiàn),應(yīng)該一小部分用戶就可以自己操作了。
這是終極目標(biāo),我的思路是直接在頁面上呈現(xiàn)頁面內(nèi)容,可以在視圖組件輸出視圖上增加一個根標(biāo)簽,如
<div viewcomponent="組件名稱">其他視圖內(nèi)容</div>
然后在頁面上使用jquery給帶有viewcomponet屬性的標(biāo)簽增加mouseover事件,當(dāng)鼠標(biāo)移動到div上后,顯示一個設(shè)置按鈕,點(diǎn)擊按鈕彈出類似第三部的配置窗口,在配置窗口中填寫參數(shù),并保存。提交保存的時候,需要把頁面的名稱及組件的名稱傳遞到服務(wù)器端,服務(wù)器端接收后,首先找到對應(yīng)的view文件,然后讀取內(nèi)容,再進(jìn)行html分析(可以使用htmlagilitypack),找到對應(yīng)的視圖組件標(biāo)簽,進(jìn)行參數(shù)替換,最后保存文件內(nèi)容。到此完成一個配置的過程。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。