ti-enxame.com

É possível usar o Razor View Engine fora do asp.net

Se eu olhar o Razor View Engine, vejo uma sintaxe muito agradável e concisa que não está particularmente ligada à geração de html. Então, eu me pergunto como seria fácil usar o mecanismo fora do asp.net em um ambiente .net "normal", por exemplo, para gerar texto, código, ...

Qualquer ponteiro, exemplo, comentário ou explicação é bem-vindo.

102
Thomas

Há duas questões aqui:

  1. Sim, você pode executar o Razor View Engine fora do contexto de um domínio de aplicativo ASP.NET, conforme explicado no blog de Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor -fora-do-aspnet-revisado-para-mvc3-rc.html
  2. No entanto, o Razor ainda se concentra principalmente na geração de marcações do tipo xml (por exemplo, HTML), no sentido em que o analisador do Razor usa a presença de <tags> Para determinar a transição entre o código e a marcação. Você provavelmente pode usá-lo para gerar qualquer texto, mas pode ter problemas quando sua saída não corresponde às suposições do Razor sobre quais são suas intenções.

Por exemplo, enquanto este é um código Razor válido (por causa da tag <div>):

@if(printHello) {
   <div>Hello!</div>
}

O seguinte snippet é inválido (porque o Hello! Ainda está sendo tratado como código):

@if(printHello) {
   Hello!
}

No entanto, há uma tag <text> Especial que pode ser usada para forçar uma transição para blocos de várias linhas (a tag <text> Não será renderizada):

@if(printHello) {
   <text>Hello!
   Another line</text>
}

Há também uma sintaxe mais curta para forçar uma única linha a fazer a transição usando @::

@if(printHello) {
   @:Hello!
}
79
marcind

Marque RazorEngine , é uma pequena estrutura construída sobre o Razor que permite que você faça isso.

34
Ariel

Dê uma olhada na biblioteca RazorTemplates . É mais leve que a biblioteca RazorEngine, é seguro para threads e possui uma interface mínima muito agradável.

Compilar e renderizar um modelo é tão simples quanto duas linhas de código:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));
21
alexey

Ambos RazorEngine e RazorTemplates já são mencionados aqui, mas confira - RazorMachine . Você pode simplesmente apontar seu aplicativo não MVC para uma pasta ~/Views de (outro) aplicativo MVC existente, executar com o envio do modelo adequado e obter saída renderizada em 2 linhas de código:

var sb = new StringBuilder();

//RazorMachine magic:
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style
var rm = new RazorMachine(htmlEncode: false);
ITemplate template = rm.ExecuteUrl("~/Twitter/twitter", tweets);

//do whatever you want with result
sb.Append(template);
8
Antonin Jelinek

Gere código ou texto: você quer dizer Modelos T4: http://msdn.Microsoft.com/en-us/library/bb126445.aspx ou ferramentas do codesmith?

3
Brian Mains