2012-07-10 58 views

回答

49

我有共同的模板和佈局工作,這兩個職位的幫助:

RazorEngine string layouts and sections?

http://blogs.msdn.com/b/hongyes/archive/2012/03/12/using-razor-template-engine-in-web-api-self-host-application.aspx

這是我的解決方案:

解決方案1: 佈局

使用通過設置_layout

@{ 
    _Layout = "Layout.cshtml"; 
    ViewBag.Title = Model.Title; 
} 

頁腳

@section Footer 
{ 
    @RenderPart("Footer.cshtml") 
} 

Layout.cshtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> 
    <head> 
    </head> 
    <body> 
     <div id="content"> 
      @RenderBody() 
     </div> 
     @if (IsSectionDefined("Footer")) 
     { 
      <div id="footer"> 
       @RenderSection("Footer") 
      </div> 
     } 
    </body> 
</html> 

TemplateBaseExtensionsð

用RenderPart方法

public abstract class TemplateBaseExtensions<T> : TemplateBase<T> 
{ 
    public string RenderPart(string templateName, object model = null) 
    { 
     string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", templateName); 
     return Razor.Parse(File.ReadAllText(path), model); 
    } 
} 

剃刀配置

集BaseTemplateType擴展TemplateBase您TemplateBaseExtensions類

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration 
{ 
    BaseTemplateType = typeof(TemplateBaseExtensions<>) 
}; 

Razor.SetTemplateService(new TemplateService(templateConfig)); 

編輯解決方案2:

如果您使用的是TemplateResolver。RenderPart不需要使用@include代替

頁腳

​​

解析器

public class TemplateResolver : ITemplateResolver 
{ 
    public string Resolve(string name) 
    { 
     if (name == null) 
     { 
      throw new ArgumentNullException("name"); 
     } 

     string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", name); 
     return File.ReadAllText(path, System.Text.Encoding.Default); 
    } 
} 

配置

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration 
{ 
    Resolver = new TemplateResolver() 
}; 
Razor.SetTemplateService(new TemplateService(templateConfig)); 

更新由鬆餅人 這個鏈接https://github.com/Antaris/RazorEngine/issues/61指定模板,呈現字符串,

var templateResolver = Razor.Resolve("Registration.cshtml"); 
return templateResolver.Run(new ExecuteContext()); 

還有我,與人相處有問題,使用_LayoutLayout工作。

'_Layout'是舊的語法。它在未來的版本中更新爲「佈局」。

+0

我試圖實現在MS博客上面的解決方案,我不斷收到一個計算器例外。我花了整整一天的時間。 – 2012-09-26 22:45:56

+0

我可以給你一個快速的應用程序一起扔,所以你得到的想法 – ministrymason 2012-09-27 09:48:04

+1

https://rapidshare.com/files/3962348204/RazorEngineConsoleApplication.zip它被扔在一起,但肯定你會明白。應用程序的基礎是RazorEngineConsoleApplication \ bin \ Debug,然後將模板複製到那裏。堅持我發佈的例子。 – ministrymason 2012-09-27 10:33:18

0

你可以很容易地用剃刀做很多事情;然而,這個特定的項目似乎將許多Razor引擎的東西抽象掉了(這是好的和壞的)。在你的情況下,這聽起來像你會更好地實現自己的Razor解決方案(實際上並不壞),然後你可以讓你的模板很容易地拋出異常或拉入其他內容。

例如;通過滾動你自己的解決方案,你可以爲你的剃鬚刀模板創建一個基類,它可以通過調用其他模板來暴露出「部分視圖」的容量。另外,如果某些屬性爲空,則可以執行模型檢查並引發異常。

0

實現與RazorEngine佈局的最簡單方法是通過佈局在@RenderBody更換你的模板()返回:

var finalHtml = layout.Replace(@"@RenderBody()", templateHtml); 

如:

_Layout.cshtml與典型的@RenderBody()

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> 
    <head> 
    </head> 
    <body> 
     <div> 
      @RenderBody() 
     </div> 
    </body> 
</html> 

Your Ra​​zorEngine template MyTemplate.cshtml

@using RazorEngine.Templating 
@inherits TemplateBase<myviewmodel> 

<h1>Hello People</h1> 
<p>@Model</p> 

何地,你叫RazorEngine模板:

var TemplateFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EmailTemplates"); 
var template = File.ReadAllText(Path.Combine(TemplateFolderPath,"MyTemplate.cshtml")); 
var layout = File.ReadAllText(Path.Combine(TemplateFolderPath, "_Layout.cshtml")); 
var templateService = new TemplateService(); 
var templateHtml = templateService.Parse(template, myModel, null, null); 
var finalHtml = layout.Replace(@"@RenderBody()", templateHtml);