2015-11-06 87 views
8

我正在使用Razor Engine從數據庫動態編譯我的剃鬚刀視圖。現在即時通訊使用剃刀引擎3.7.3。我看到很少有關於如何閱讀html助手並編譯它的文章,但它是針對舊版本的剃鬚刀引擎。解析html helper

我已閱讀約ITemplateServiceConfiguration,但我真的不明白它是如何工作。

我的問題是,我怎麼能runco​​mpile()razorengine(v3.7.3)成功地與@Html(HTML幫助),@url(URL助手),並@部分(如@section腳本,@section特色)在我的數據庫的HTML內容?

我到目前爲止所做的事情。我試圖實現我從另一篇文章中獲得的代碼。該代碼旨在用於舊版本的剃鬚刀引擎。他建議,我們創造我們自己的助手:

public class RazorHtmlHelper 
{ 
    public IEncodedString Partial(string viewName) 
    { 
     ITemplate template = RazorEngine.Razor.Resolve(viewName); 

     ExecuteContext ec = new ExecuteContext(); 

     RawString result = new RawString(template.Run(ec)); 

     return result; 
    } 
} 

public class RazorUrlHelper 
{ 
    public string Encode(string url) 
    { 
     return System.Uri.EscapeUriString(url); 
    } 
} 

然後,他建議創建自己的模板:

public class RazorTemplateBase<T> : TemplateBase<T> 
{ 
    private RazorUrlHelper _urlHelper = new RazorUrlHelper(); 

    private RazorHtmlHelper _htmlHelper = new RazorHtmlHelper(); 

    public RazorUrlHelper Url 
    { 
     get 
     { 
      return this._urlHelper; 
     } 
    } 

    public RazorHtmlHelper Html 
    { 
     get 
     { 
      return this._htmlHelper; 
     } 
    } 
} 

和解析之前,我們需要設置我們的配置:

Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() 
{ 
    BaseTemplateType = typeof(RazorTemplateBase<>) 
}; 
)); 

result = RazorEngine.Razor.Parse(templateText, model); 

RazorUrlHelper沒有問題,但RazorHtmlHelper無法正確讀取這些代碼,因爲它已被棄用:

ITemplate template = RazorEngine.Razor.Resolve(viewName); 
ExecuteContext ec = new ExecuteContext(); 
RawString result = new RawString(template.Run(ec)); 

以上代碼是從this post

+0

你能告訴你到目前爲止你做了什麼嗎? 因此,我們可以幫助你更好 –

+0

好吧,我編輯它,請審查。 –

+0

[RazorEngine WebApiTemplateBase @ Url.Content()]可能的重複(http://stackoverflow.com/questions/32461041/razorengine-webapitemplatebase-url-content) – matthid

回答

-1

我不完全相信我的建議將直接解決您的問題。在我的專業經驗中,試圖利用已棄用的課程並沒有產生積極的結果。我個人不會嘗試從數據庫直接渲染視圖。如果我在您的位置上利用MVC4的剃鬚刀視圖引擎,我會放棄您的方法,請按照以下步驟操作。

  1. 右鍵單擊您的項目,並使用nuget將MVC4和所有包含的js/dll/libraries更新到最新版本。
  2. 創建一組包含變量的模型對象,以容納將從數據庫中提取的所有信息。利用繼承或設計它們,使得它們可以有效地用於每個請求的請求。
  3. 爲您的MVC項目構建主要的主視圖和局部視圖,以最有效地防止任何重複的前端代碼。如果這些視圖主要返回HTML響應,請將控制器操作設置爲指向應用程序主視圖的ActionResult()。使用這些控制器操作中的數據庫填充模型對象所需的所有數據,並將填充的模型對象傳遞到主視圖。
  4. 在部分視圖和主視圖中,可以將此模型對象定義爲視圖頂部的主模型,並將模型變量作爲參數傳遞給HTMLHelpers。
  5. 創建HTML Helper對象,將這些模型變量作爲參數,並在Views/web.config文件中定義它們的命名空間。在這個例子中,我使用了命名空間System.Web.HtmlHelpers。如果您不這樣做,您將無法利用視圖中基本命名空間之外的任何自定義助手。

    <system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
        <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
        <namespaces> 
        <add namespace="System.Web.Mvc" /> 
        <add namespace="System.Web.Mvc.Ajax" /> 
        <add namespace="System.Web.Mvc.Html" /> 
        <add namespace="System.Web.Optimization"/> 
        <add namespace="System.Web.Routing" /> 
        <add namespace="System.Web.HtmlHelpers" /> 
        </namespaces> 
        </pages> 
    </system.web.webPages.razor> 
    
  6. 在你HTMLHelpers命名空間的類,創建MVCHtmlString或者把你的數據庫模型參數,並將其轉化爲工作和運作的HTML/JSON或XML等MVC方法。在部分視圖和主視圖中引用這些自定義HTML助手。

如果實施這樣的HTMLHelpers,您正在使用訪問數據和結構化數據庫中的數據轉換成可視的HTML邏輯抽象掉你的JIT編譯的代碼(所有視圖代碼)。在上面的示例中,您將在運行時編譯您的視圖的大部分邏輯,這在性能方面非常昂貴。 MVC是這樣設計的,所以你可以防止承擔所有這些開銷。如果您創建了預編譯庫中存在的強大的HTML幫助程序,則可以使您的視圖代碼非常小且簡單。