2012-05-03 19 views
7

Vorrei utilizzare il seguente modello Razor con RazorEngine:RazorEngine - Usa Layout e Html.Raw

@{ 
    Layout = null; 
} 

@Html.Raw(MyNamespace.MyClass.SomePropertyWithHtml) 

Quando lo chiamo io ottengo 2 errori - uno lamentarsi che non può gestire layout, e un altro si lamenta che non sa come comportarsi con l'helper Html.

Ci sono altre domande e risposte che suggeriscono che questo è possibile in v3, e sto usando il pacchetto corrente su NuGet - v3.0.8 - ma non è chiaro come sia fatto. Attualmente sto chiamando in questo modo:

string html = RazorEngine.Razor.Parse(File.ReadAllText(path)); 

Altre risposte suggerisco di usare Razor.SetBaseTemplate prima, che non compare nella sorgente di corrente o il ramo 3.0 su git. Guardando il codice vedo codice che fa riferimento a layout e sezioni, ma il codice di layout sembra dipendere dalla risoluzione di un modello per nome, mentre quello che sto cercando di fare non ha nemmeno bisogno di risolvere un modello - ho solo bisogno di far fronte con il layout = null. Il codice include anche un MvcTemplateBase che sembra offrire un HtmlHelper nel progetto Web, ma è l'unica classe in quel progetto e non è referenziato in alcuno dei progetti Web o Core.

Questa domanda simile: RazorEngine issues with @Html

Basta un link alla homepage dicendo è possibile saperne di più là - la home page è solo una breve frase che descrive il progetto.

Quindi, come si analizza la vista Razor precedente con RazorEngine v3.0?

+0

Oh, stai usando RazorEngine ... Una cosa da tenere a mente è che Razor non è MVC. Molto lavoro è stato fatto con il nuovo RazorEngine ma Antaris è stato molto impegnato ultimamente. Dovresti essere in grado di usare '@inherits MvcTemplateBase ' nella parte superiore del tuo file per usarlo. – Buildstarted

+2

Grazie per il suggerimento. Mi rendo conto che Razor e MVC sono separati, ma il mio obiettivo è utilizzare gli stessi modelli MVC Razor all'interno e all'esterno della normale pipeline ASP.Net. La versione su NuGet non contiene una classe denominata MvcTemplateBase. L'ultima versione di Git lo fa, ma non è generico, è solo MvcTemplateBase. Se aggiungo una riga come @inherits RazorEngine.Razor.MvcTemplateBase, ottengo un'eccezione in TemplateService.SetModelExplicit che lamenta che il tipo di modello non ha una proprietà denominata Modello. Idee? –

risposta

2

La proprietà Layout e il Html aiutante non sono una parte di TemplateBase, e l'implementazione di MvcTemplateBase che è una parte della versione più recente di RazorEngine (v3.4.1) appare incompleto (InitHelpers non sembra per inizializzare le aiutanti ?). Dovrai creare il tuo modello base che implementa queste funzionalità.

Come notato, le versioni di v3 + non includono un metodo Razor.SetBaseTemplate. È possibile impostare un tipo di modello di base nella versione corrente in questo modo:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     BaseTemplateType = typeof(MyTemplateBase<>) 
    }; 

using (var service = new RazorEngine.Templating.TemplateService(config)) 
{ 
    Razor.SetTemplateService(service); 
    return MvcHtmlString.Create(Razor.Parse<TModel>(templateText, model)); 
} 

se avete bisogno di inizializzare aiutanti, può essere utile per ignorare CreateInstance in un'implementazione personalizzata di IActivator, che può essere fornita al TemplateServiceConfiguration come il BaseTemplateType:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     BaseTemplateType = typeof(MyTemplateBase<>), 
     Activator = new MyActivator() 
    }; 
+0

Hmm quale versione di RazorEngine stai usando? O hai derivato MvcTemplateBase come classe? La fonte corrente non ha una versione generica di MvcTemplateBase: https://github.com/Antaris/RazorEngine/blob/master/src/Web/RazorEngine.Mvc/MvcTemplateBase.cs –

+0

Questa è un'implementazione di MvcTemplateBase.Il punto di cui sopra è quello di dimostrare che è ancora * possibile * in effetti impostare un modello di base per ereditare tutte le tue viste, che ti consentirà di implementare l'helper HTML, la funzionalità di layout di base o qualsiasi altra cosa che ti serva da TemplateBase di RazorEngine non offre fuori dalla scatola. – jdmcnair

+0

Chiarito la mia risposta sopra. Ho notato prima che questa domanda ha più di 2 anni, ma penso che questo risponda ancora. Fammi sapere se qualcosa non è chiaro. Forse questo aiuterà ancora qualcuno. – jdmcnair

Problemi correlati