2013-01-08 62 views
1

我正在尋找一種方法來重新使用我的MVC Razor視圖作爲客戶端呈現的JavaScript模板,並發現了將剃鬚刀視圖分析爲javascript函數的this library(Razor Client Template)。RazorTemplateEngine分析器產生不尋常的語法樹

它不會與Razor引擎版本2玩球,有點挖掘顯示這是因爲Razor引擎的語法樹已被徹底檢查。在嘗試修改事情時,我發現了RazorViewEngine解析器的一些奇怪結果。

我有一個非常簡單的看法,就像這樣:

@model Justis4.Models.EntityModel 
<div> 
    @Model.PropertyOne 
    @Model.PropertyTwo 
</div> 

剃刀客戶端模板庫開始了與:

var host = new RazorEngineHost(newCSharpRazorCodeLanguage()); 
var engine = new RazorTemplateEngine(host); 
var parserResults = engine.ParseTemplate(razorTemplate); //from string reader 
var doc = parserResults.Document; 

,然後熄滅,開始分析所產生的語法樹成javascript函數。

當我通過語法樹調試時,我看到一些奇怪的東西。據我瞭解,Razor引擎將視圖分解爲不同類型的「塊」和「跨度」。但如圖所示,頂部的模型聲明已被解析爲標記,而不是代碼。也有類似的怪異現象,因此,解析爲JavaScript的其餘部分失敗。

enter image description here

回答

2

標準剃鬚刀的解析器不承認@model關鍵字。關鍵字@model來自System.Web.Mvc程序集中的MvcCSharpRazorCodeParser類。

此功能的主要功能來自SetModelTypeCodeGenerator。該類使用核心剃鬚刀引擎類SetBaseTypeCodeGenerator將剃鬚刀視圖的基本類型從默認WebViewPage更改爲WebViewPage<Model>

解決方案

使用@inherits關鍵字,而不是如@inherits WebViewPage<EntityModel>

或者,添加對System.Web.Mvc的引用,並使用自定義語言將代碼解析器更改爲MvcCSharpRazorCodeParser。您需要將RazorEngine.DefaultBaseClass屬性設置爲您打算使用的基類的非通用版本,例如,對於WebViewPage<T>,您將設置engine.DefaultBaseClass = "System.Web.Mvc.WebViewPage"

class MvcCSharpRazorCodeLanguage : CSharpRazorCodeLanguage 
{ 
    public override ParserBase CreateCodeParser() 
    { 
     return new MvcCSharpRazorCodeParser(); 
    } 
}