Razor內幕之運算式

來源:互聯網
上載者:User

我們看一下之前例子中的代碼:<li>@p.Name ($@p.Price)</li>是如何解析的。  當遇到"<li>"字元序列的時候,解析器知道正在解析一個以"</li>"為結束標誌的標記。然後標記解析器在解析到結束標誌之前發現了一個"@"字元,就像"@foreach"一樣,再次切換到代碼解析器。這時和之前的解析有些不同,C#代碼解析器發現第一個標識符"p"時,它會檢查這個標識符是不是C#的關鍵字;當然"p"並不是C#關鍵字,所以代碼解析器進入"隱式運算式"模式。解析隱式運算式的演算法看起來是這樣的:

  首先讀取一個標識符,

  下一個字元是"("或者"["?

  是則讀到匹配的")"或者"]",然後跳到2

  不是則繼續3

  下一個字元是"."?

  是則繼續4

  不是則結束運算式

  "."後面的字元是合法的C#標識符的開始?

  是則讀取"."並跳到1

  不是則不讀"."並結束運算式

  總體來說就是:一個隱式運算式就是一個標識符,之後可以跟任意數量的方法調用("()")、索引運算式("[]")及成員存取運算式(".")。但是,除了在"()"或者"[]"裡面,是不允許空格存在的。例如,下面是一些合法的Razor隱式運算式:

@p.Name   
@p.Name.ToString()   
@p.Name.ToString()[6 - 2]   
@p.Name.Replace("ASPX", "Razor")[i++]  

  下面是一些非法的運算式,這些運算式只有部分("==>"之後的部分)會被Razor認為是運算式。

@1 + 1 ==> @   
@p++ ==> @p   
@p    .   Name ==> @p   
@p.Name.Length – 1 ==> @p.Name.Length   

  這是我們為什麼需要另一個運算式文法:"@(...)"的原因,通過這個文法我們可以把任何想要的東西放到"()"裡面,上面的例子用這個文法來表示就是:

@(1 + 1)    
@(p++)    
@(p    .   Name)    
@(p.Name.Length - 1)   

  一旦我們驗證了運算式,我們會把它傳遞到代碼產生器中。當為"@foreach () { … }"產生代碼的時候,會把代碼寫到產生的C#類檔案中。對於運算式(無論是顯示的或者是隱式的)來說,這個過程有一點不同,不像ASPX,這裡只有一個控制結構"@",並沒有"@="來區分運行代碼和要輸出值的運算式,但這也是Razor的魅力所在。例如,當發現"@foreach"的時候,我們知道"foreach"是C#中的一個關鍵字,所以這個塊會被作為聲明來執行;而發現"@p.Name"或者"@(1 + 1)"的時候,我們知道它們是運算式,所以在執行這些語句之後輸出了執行結果。

  總之:

  @if, @switch, @try, @foreach, @for, 等是和"<% %>"一樣的

  @p.Name, @(p++), @(1 + 1),等是和"<%: %>"一樣的

  另一個需要注意的地方就是運算式等同於"<%:"而不是"<%=""。在Razor中預設應該進行HTML Encode處理,如果不想進行HTML Encode處理,可以使用IHtmlString介面。

  知道解析原理之後,下面我們再回到之前的代碼:

<li>@p.Name ($@p.Price)</li>  當發現"@p.Name"之後,可以識別出這是一個運算式,通過"("字元之前的空格解析出這不是一個方法調用,之後是文本標記""($",然後再次發現"@"之後將"@p.Price"解析為運算式,最後以")"結束。



相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。