2010-09-02 84 views
94

如果我看Razor View Engine,那麼我會看到一個非常簡潔的語法,它並不特別與生成html相關聯。所以我想知道,在asp.net的「普通」.net環境中使用引擎之外的引擎是多麼容易,例如生成文本,代碼......是否可以在asp.net外部使用Razor View Engine

任何指針,示例,註釋或解釋都是受歡迎的。

回答

70

這裏有兩個問題:

  1. 是的,你可以在ASP.NET應用程序域的上下文之外運行Razor視圖引擎,在安德魯的博客中解釋:http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of-aspnet-revised-for-mvc3-rc.html
  2. 然而,剃刀仍然主要集中在生成類似xml的標記(例如HTML),因爲Razor解析器使用<tags>來確定代碼和標記之間的轉換。您可以使用它來生成任何文本,但是當您的輸出與剃刀對您的意圖是什麼的假設不匹配時,您可能會遇到問題。

因此,舉例來說,雖然這是(因爲<div>標記的)有效剃刀代碼:

@if(printHello) { 
    <div>Hello!</div> 
} 

下面的代碼片斷是無效的(因爲你好仍然被視爲代碼!):

@if(printHello) { 
    Hello! 
} 

但是有一個特殊的<text>標籤可以用來強制多行塊(<text>標籤將不會被渲染)的過渡:

@if(printHello) { 
    <text>Hello! 
    Another line</text> 
} 

還有一個更短的語法來強制單行使用@:轉變:

@if(printHello) { 
    @:Hello! 
} 
+2

嗯,我正在考慮用它來生成電子郵件或即時IronPython代碼代。由於這些不使用標籤,因此最好查看其他選擇。感謝你的回答。 – Thomas 2010-09-03 07:23:47

+6

@Thomas Razor在這些場景中應該可以做得很好,你只需要不時添加這些魔術''標籤或者使用'@:'''。一旦支持VS編輯器支持Razor語法,就可以很容易地判斷轉換髮生的時間。 – marcind 2010-09-03 15:42:43

3

生成代碼或文本:你的意思是像T4模板:http://msdn.microsoft.com/en-us/library/bb126445.aspx或codesmith工具?

+0

這需要upvotes因爲T4有與Razor相似,並且是一個實際的多用途代碼生成器,作爲Visual Studio中的一個功能提供 - 實質上它是一個通用的'Razor' – 2015-07-01 22:02:13

+0

我的理解是T4模板只能在編譯時更改, .tt文件被轉換並保存爲.cs文件。在我的使用中,一個半技術用戶想要更新模板而不必重新構建應用程序。有沒有簡單的方法可以使用T4模板來實現? – daveb 2017-03-22 16:06:41

+0

很可能,只要它生成的內容可以被解釋,就像CSHTML可以在運行時由Razor引擎一樣。你也可以通過編程觸發它來生成代碼,但編譯代碼必須由編譯器解析才能使用.... – 2017-03-27 19:39:52

32

檢查RazorEngine,它是建立在剃刀之上的微架構,可以讓你做到這一點。

+0

在.net 4中定位應用程序時安裝此項目時出現問題,需要更新。 – 2014-06-24 13:08:29

+0

不工作atm。我正在尋找另一種選擇。 – 2017-08-18 14:51:38

18

看看RazorTemplates庫。它比RazorEngine庫更輕量,它是線程安全的,並具有非常好的最小界面。

編譯和執行模板是兩行代碼那樣簡單:

var template = Template.Compile("Hello @Model.Name!"); 
Console.WriteLine(template.Render(new { Name = "World" })); 
+1

您是否突出了RazorTemplates b/c的線程安全性?此問題的其他建議解決方案之一是不是?我特別感興趣的是RazorEngine。 – 2012-11-29 19:43:33

+1

這個項目還沒有更新很久。 – 2014-06-24 13:07:56

7

兩個RazorEngineRazorTemplates已經在這裏提到的,但檢查出RazorMachine。您可以在非MVC應用程序簡單地指向(另一個)現有的MVC應用程序的〜/ Views文件夾,以發送正確的模型執行,並獲得兩行代碼渲染輸出:

var sb = new StringBuilder(); 

//RazorMachine magic: 
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO 
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style 
var rm = new RazorMachine(htmlEncode: false); 
ITemplate template = rm.ExecuteUrl("~/twitter/twitter", tweets); 

//do whatever you want with result 
sb.Append(template); 
相關問題