2013-07-27 20 views
2

我正在閱讀這個關於剃刀模板代表的優秀文章。 http://www.prideparrot.com/blog/archive/2012/9/simplifying_html_generation_using_razor_templates剃刀模板委託,內部工作如何?

雖然我理解它是如何使用的,如在

Func<dynamic, HelperResult> variable = @<var>@item.ProductName</var> 

我的問題是,究竟是如何剃刀引擎翻譯「@<var>@item.ProductName</var>」到背景中的代表?作爲

Func<dynamic, HelperResult> variable = delegate(dynamic x) 
{ 
    (what goes on in here?) 
} 

@item保留關鍵字是剃刀解析出?它可以用於任何其他約定嗎?說@column@row或任何其他方式?

非常感謝。就像我說的,我更感興趣的是剃鬚刀視圖引擎如何將模板語句翻譯成背景中的實際代碼。

[編輯]感謝Brad指出Andrew的文章。所以上面的語句「@<var>@item</var>」將轉化爲

Func<dynamic, HelperResult> variable = delegate(dynamic item) 
{ 
    return new Microsoft.WebPages.Helpers.HelperResult(__writer => { 
    @__writer.Write(" "); 
    @__writer.Write("<var>"); 
    @__writer.Write(item.ProductName);  <--- what's happening here? 
    @__writer.Write("</var>"); 
} 

所以我看到剃刀自動解析出@<var></var>成單獨的字符串和這樣的,我在關於「item.ProductName」 is..suppose「項」問題一個「Proudct」類型,那麼剃鬚刀正試圖做什麼?

首先,剃刀分析「@ item.ProductName」,用逗號分隔「。」,獲得「item」和「ProductName」。

然後由於「動態」參數,在後臺,.NET將嘗試查找「Product」項的屬性「ProductName」的值?

謝謝

+1

是,'@ item'被保留,是一個具體的實現。如果你需要更強大/精細的東西,你必須尋找一個'@ helper'或'HtmlHelper'擴展名。 (進一步閱讀:[Phil Haacked](http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx),[Andrew Nurse](http://vibrantcode.com/blog/2010) /8/2/inside-razor-part-3-templates.html/),[Scott Guthrie](http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx) ) –

+0

Thanks @Brad。這解釋了我混亂的一部分。你知道剃鬚刀視圖引擎是如何將該語句翻譯成背景中的匿名代表的嗎?非常感謝。 – Liming

+1

我更新了評論,查看這些鏈接(特別是Andrew Nurse的) –

回答

0

沒關係。我不知道爲什麼我沒有建立聯繫。

我問了關於DynamicObject DynamicObject? How does the following code work?的另一個問題,@Alxandr解釋了關於「動態」的一個問題。所以基本上,它成爲

dynamic item = new Product(...); 
String ProductName = item.ProductName; 
本質

因此,在後臺使用CSharpGetMemberBinder並通過反射「動態」的參數,計算出物體「產品」的「產品名稱」。

剃刀模板有一個非常輝煌的設計