2016-07-29 21 views
3

Ich habe eine template.cshtml erstellt, die 2 Teillisten header.cshtml und footer.cshtml enthält.Verwenden Sie mehrere Vorlagen mit getrennten Viewmodel mit RazorEngine

Wenn es gemacht wird, es sieht wie folgt aus:

enter image description here

IRazorEngineService service = RazorEngine.Engine.Razor; 

string _webPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "views"); 
var config = new TemplateServiceConfiguration 
{ 
    //Use this template manager when loading from template files. 
    TemplateManager = new ResolvePathTemplateManager(new[] { _webPath }) 
}; 

service = RazorEngineService.Create(config); 
ITemplateKey key = service.GetKey("template"); 

service.Compile("header", typeof(HeaderViewModel)); 
service.Compile("footer", typeof(FooterViewModel)); 

var model = new ContentViewModel(); 
model.Content = "This is the content"; 

model.FooterViewModel = new FooterViewModel(); 
model.HeaderViewModel = new HeaderViewModel(); 
model.FooterViewModel.Footer = "footer"; 
model.HeaderViewModel.Header = "header"; 

var html = service.RunCompile(key, model.GetType(), model); 

template.cshtml

@model RazorMachineTest.ContentViewModel 

<html> 
<body> 
     <header> 
      @Include("header", @Model.HeaderViewModel, typeof(RazorMachineTest.HeaderViewModel)) 
     </header> 

     <h1>@Model.Content</h1> 

     <footer> 
      @Include("footer", @Model.FooterViewModel, typeof(RazorMachineTest.FooterViewModel)) 
     </footer> 

</body> 
</html> 

header.cshtml

@using RazorEngine 
@using RazorMachineTest 

<b>I am inside the</b> 
<span>@Model.Header</span> 

footer.cshtml

@using RazorEngine 
@using RazorMachineTest 

<b>I am inside the </b> 
<span>@Model.Footer</span> 

Was ich über die Lösung nicht gefällt ist, dass die Viewmodels ineinander enthalten sein müssen.

Ich möchte eine Trennung von jedem Viewmodel haben, sollte man nicht die andere kennen. Der Grund dafür ist, dass der Inhalt keine allgemeine Kopf- oder Fußzeile kennen sollte oder nicht der Überbegriff einer allgemeinen Kopf-/Fußzeile sein sollte.

Weil ich die Vorlage mit vielen verschiedenen "Content" Viewmodels wiederverwenden möchte.

Was genau muss ich ändern, damit diese Arbeit auf meinem bestehenden Code basiert?

Hinweis: Don`t verwirrt, wenn man RazorMachine Namespaces gelesen, dass für die Prüfung war ...

+0

Sie sind bereits das Modell in der '@ geben include' so einfach speichern sie anderswo ein Und nicht im Modell? –

+0

Wie kann ich das Include aufrufen und nicht gleichzeitig das Modell übergeben? Hast du bitte einen Beispielcode? – HelloWorld

+0

Sie geben das Modell von woanders. Es muss nicht in demselben Modell sein, das Sie den Ansichten geben. Oder Sie können einfach immer ein einfaches Modell drücken, das die drei Modelle kapselt, so dass sie getrennt sein können. –

Antwort

0

Sie können den Inhalt für die Kopfzeile/Fußzeile in die Viewbag setzen

var viewBag = new DynamicViewBag(); 
viewBag.AddValue("Footer", "footer"); 
viewBag.AddValue("Header", "header");        
var html = service.RunCompile(key, model.GetType(), model, viewBag); 

dann in die Vorlagen können Sie die viewbag mit @ Zugriff ViewBag.Header

https://antaris.github.io/RazorEngine/TemplateBasics.html#Supported-syntax

+0

Ich möchte mich an meinen stark typisierten Ansatz halten, denn später möchte ich Intellisense integrieren. – HelloWorld

+0

Vielleicht können Sie die TemplateBase so erweitern, dass sie Eigenschaften für Ihre Modelle für Ihre Kopf- und Fußzeile enthält, die stark typisiert bleiben.Dann können Sie die Modelleigenschaften festlegen, nachdem Sie 'service.Compile()' ausgeführt haben, die die Vorlage zurückgibt. https://antaris.github.io/RazorEngine/TemplateBasics.html#Extending-the-template-Syntax –