Asp.net MVC 3 中引入了一個新的View Engine: Razor。使用Razor不需要學習新的語言,也更容易將動態代碼與HTML結合,拋卻了<%%>這樣的標記,使用一個神奇的@號,就能搞定一切,就像JQuery中的$號一般神奇,而且能夠給我們留下更乾淨的HTML代碼。相比Aspx,在VS2010中,Razor更加智能,現在寫一個對Model的型別宣告終於可以靠文法提示完成了。
在View的第一行鍵入 @model WebApplication1.Models. 這裡就會有智能提示搞定了。
Razor引擎的視圖為cshtml格式,下面對比下兩種指令碼引擎的文法,以下,都參考Scott的部落格上的介紹。首先,國際慣例,先來個Hello World。 Hello world
實現如圖的頁面:
使用 .ASPX,我們需要寫 <%= %>的文法來輸出一個變數,像下面這樣寫:
輸出一個變數,需要五個字元 <%= %>,而且%這個字元需要按Shift+5,是一個不容易輸入的字元。如果我們使用Razor,像下面一樣:
Razor解析器能讀懂C#/VB的文法,並能提供智能感知,所以上面的代碼,就不需要明確的指定代碼塊。Razor能夠識別上述語句,將他們作為自包含的代碼塊。上面的代碼中,我們輸出一個變數只需要1個@字元,比aspx中節省了4個。而且@號比其%號,容易敲多了,這樣在輸入代碼的時候,鍵盤敲擊會更流暢。 迴圈與Html嵌套
讓我們看一下另一個簡單應用情境,需要列出一些產品名稱極其價格:
使用.aspx
使用ASP.net的文法,我們需要將這個代碼多處用 <%%> 來聲明。
使用Razor:
看看是不是簡單多了。因為Razor能識別C#/VB的語義,所以會自動的將foreach的第一行與最後一行作為代碼塊處理。而且能夠自動提供對象 p 的文法提示。這樣使得編碼更為簡介,能大幅度提高編碼過程的效率。 If 語句和多行語句(Razor Only)
If 語句,
多行語句:
你可以聲明多行代碼使用 @{ Code }
也可以 直接使用像下面這樣 @()
整合內容與代碼
看到@符號,自然會聯絡到EMail,如果我們嵌入的代碼中,有一個EMail地址,會被怎麼處理呢。Razor會分析@右邊的內容,是否為Razor的內建對象或者變數等,所以EMail地址不會被誤解析:
你想要輸出一個@號,那麼,輸入 @@ 就可以了。
識別嵌入的內容
當將Html內容嵌入到if-else, for , foreach, 或者其他的塊語句,你需要將內容包含在HTML或者XML標記中,以便Razor能夠更好的識別這些內容。
例如,下面的代碼將多行的內容包含在中:
將輸出:
如果你不想要使用一個HTML標記來包圍這些內容,你可以使用一個標記,如下所示
將輸出
HTML編碼
預設的,所有的使用@輸出的內容都會被自動進行HTML編碼,以更好的放置XSS 攻擊。如果一定要輸出HTML代碼,例如富文字編輯器邊際的HTML代碼,需要使用如下的方法:
@(new MVCHtmlString(article.Body))
這樣將不會進行HTML編碼。 Layout/MasterPage - 基礎
從ASP.net 2.0開始,就提供了MasterPage主版頁面的功能,可以是網站中的頁面能夠使用一致的外觀。Razor也能夠支援這種概念,在Razor中,使用Layout Pages來提供這一功能。能夠允許你定義一個通用的網站摸吧,然後在你所有的視圖中繼承這一外觀。
簡單的Layout樣本
下面是一個簡單的Layout樣本,它可以包含所有的靜態HTML內容,也可以包含動態伺服器端代碼。我們可以在需要插入指定主題內容的位置,調用@RenderBody() Helper方法。
然後我們可以建立一個Home.cshtml的視圖,該視圖使用這個Layout頁,只需要在頭部加入LayoutPage="siteLayout.cshtml"【這個貌似是beta版,正式版為Layout="…………"】
Layout/MasterPage 情境 - 添加Section
在Razor中,可以在Layout 中Render多個 Section,在View中然後選擇性的填充這些Section。這樣可以給網站的頁面配置提供極大的靈活性。
例如,Layout頁的左側,可以加入一個菜單的顯示,那麼可以在Layout頁中寫入一個
@RenderSection("menu", required:false)
在需要菜單的頁面中,我們定義這個Section
@setion menu{
sub-menu"> Menu item 1 Menu Item 2 }
如果不需要菜單,那就不要定義這個Section,就不會有菜單。 封裝-重用 Html 助手
在Asp.net MVC中,使用了很多Helper函數,最常用的就是 Html Helpers。
基於代碼的Html Helpers
ASP.net MVC使用了 Html Helpers的概念,這些Helpers是一些可以在代碼塊中調用的方法,他們用來產生HTML代碼。這些方式一般都寫成了擴充方法,使用純程式碼編寫。在Asp.net MVC中所有的HTML擴充方法,都可以在Razor中工作,不需要改變任何代碼:
聲明Html Helpers
使用純程式碼的方法來產生HTML是沒問題,但是不夠理想。在Razor中,有一種更容易的方法來產生一個可重用的Html助手。使用@helper{}聲明即可:
然後,我們可以在視圖中調用這個Pager
Visual Studio對Razor提供了良好的支援,完全支援智能感知