2012-07-10 9 views

Odpowiedz

49

mam wspólne szablony oraz pracę układu, przy pomocy tych dwóch stanowisk:

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

To jest moje rozwiązanie:

Rozwiązanie 1: Layout

Użyj d ustawiając _Layout

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

stopka

@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

Extend TemplateBase z metodą 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); 
    } 
} 

Razor Config

Set BaseTemplateType do klasy TemplateBaseExtensions

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

Razor.SetTemplateService(new TemplateService(templateConfig)); 

Edycja Rozwiązanie 2:

Jeśli używasz TemplateResolver.RenderPart nie potrzeba używać @include zamiast

stopka

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

Resolwer

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); 
    } 
} 

Config

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

Aktualizacja przez The Muffin Man Określ szablon i renderowanie ciąg

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

Również ja, wraz z innymi pod tym linkiem https://github.com/Antaris/RazorEngine/issues/61 miał problemy z używaniem _Layout natomiast Layout pracował.

'_Layout' to stara składnia. Został zaktualizowany do "Układu" w przyszłej wersji.

+0

starałem się wdrożyć rozwiązanie w blogu MS powyżej Wciąż dostaję stackoverflow wyjątek. Spędziłem cały dzień na tym. –

+0

Mogę wysłać ci szybką aplikację, którą zrzucę razem, więc masz pomysł: – ministrymason

+1

https://rapidshare.com/files/3962348204/RazorEngineConsoleApplication.zip Został wyrzucony razem, ale na pewno wpadniesz na pomysł. Podstawą aplikacji jest RazorEngineConsoleApplication \ bin \ Debug, więc skopiowałem tam szablony. Aby trzymać się przykładu, który napisałem. – ministrymason

0

Możesz łatwo zrobić wiele rzeczy za pomocą Razor; jednak ten konkretny projekt wydaje się odciągać wiele rzeczy, które możesz zrobić Razor (co jest dobre i złe). W twojej sytuacji brzmi to jakbyś był o wiele lepszy od wdrożenia własnego rozwiązania Razor (tak naprawdę nie jest tak źle), a potem możesz mieć szablony wyrzucające wyjątki lub pobierające inne treści całkiem łatwo.

Na przykład; przetaczanie własnego rozwiązania pozwala stworzyć klasę podstawową dla szablonów maszynki do golenia, które mogą ujawnić zdolność do wciągania "widoków cząstkowych" poprzez wywoływanie innych szablonów. Ponadto można wykonać sprawdzanie modelu i zgłaszać wyjątki, jeśli pewne właściwości są zerowe.

0

Najprostszym sposobem wdrożenia układ z RazorEngine jest zastępując co zwrot szablonu w @RenderBody() w układzie:

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

np

swojej _Layout.cshtml z typowym @RenderBody()

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

szablonie RazorEngine MyTemplate.cshtml

@using RazorEngine.Templating 
@inherits TemplateBase<myviewmodel> 

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

i gdziekolwiek zadzwonić szablon 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);