本文主要講述了在asp.net mvc中,頁面靜態化的幾種思路和方法。對於網站來講,生成純html靜態頁面除了有利於seo外,還能夠減輕網站的負載能力和提升網站性能。在asp.net mvc中,視圖的Razor引擎和控制器爲咱們靜態化提供了新的思路和方法,咱們能夠利用視圖引擎和重寫過濾器進行靜態操做。html
先說下本人目前已知的靜態化思路,大概有4種方法:web
這是最多見的方法,這種方法須要先編寫一個html模板頁,模板中定義好須要替換的佔位符標識,在須要生成HTML頁面的時候,將自定義的佔位符標識替換成要展示的內容。好比模板html頁面中,有個@template_placeholder_articlecontent標識(表示文章的內容),咱們就可使用string.Replace方法將標識替換成所需的文章內容,或者使用正則表達式進行替換。正則表達式
最後將生成的靜態網頁內容經過IO保存爲html頁面,具體的實現步驟能夠看下這篇文章:ASP.NET MVC使用HTML模板進行靜態化操做服務器
這種方式是我比較推薦的方法,由於可使用視圖文件做爲靜態模板,還可搭配佈局頁來使用,這樣動態界面和靜態界面都是同一套模板,減小了額外編寫靜態模板的時間!而且在靜態化時,填充數據也十分簡單,依舊是使用模型數據!mvc
大概說下思路,首先使用ViewEngines類找到要靜態化的View視圖,而後經過ViewContext類將數據模型填充到視圖中,再使用ViewContext.View.Render(ViewContext viewContext, TextWriter writer)方法將獲取視圖頁面的輸出流,最後經過File.WriteAllText(string path, string contents)方法將頁面內容寫入到磁盤中。asp.net
我另外寫了一篇文章來詳細的說明:ASP.NET MVC 使用視圖引擎實現頁面靜態化。畢竟這種方式須要涉及到多個MVC特性的使用,文章中會分享一個已經寫好的幫助類,能夠很容易的進行調用和操做。佈局
PS:外國猿類同胞的思路:Rendering ASP.NET MVC Views to Stringpost
咱們能夠經過重寫過濾器來實現一個自定義的靜態操做過濾器。經過繼承IResultFilter接口,利用HttpResponse.Filter將頁面內容輸出到流中,最後經過IO操做生成靜態頁面。性能
能夠查閱這篇文章:利用ResultFilter實現asp.net mvc3 頁面靜態化優化
另外利用Response.Filter屬性自己也是一種生成靜態頁的方法,網上也是有不少相關資料。
本人十分不推薦使用這種方法,這種方法是直接在服務端用字符串拼接html代碼,最後保存爲.html後綴的靜態網頁。經過拼接字符串,對於維護、優化、代碼查看來講,都是很是不友好的,有可能會坑了之後維護代碼的兄弟。畢竟一大堆的StringBuilder.Append方法是和很不雅觀的,並且也十分不靈活,須要使用大量的轉義符號!
這裏我建議看這篇文章:使用XML及XSL生成簡單HTML
這種方式主要是將數據保存成XML,經過與XSL模板進行轉換後(至關於數據填充到模板中),造成純HTML頁面字符串,最後進行IO操做保存並生成靜態頁面,這也算是另一種方式的靜態化。
另外據說可使用自定義基架模板,好比MVC中默認的T4模板(Text Template Transformation Toolkit),具體我也不太瞭解,有興趣的朋友能夠看下。
這裏額外的說下生成靜態頁面的時機,通常是根據業務需求來決定,有條件也能夠編寫一個服務程序,在服務器上自動定時生成純靜態的HTML頁面。固然也能夠在進行添加、刪除、修改頁面等操做後再進行靜態化處理。