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

102

Se eu olhar para o Razor View Engine, vejo uma sintaxe muito boa 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 indicação, exemplo, comentário ou explicação é bem-vinda.

Thomas
fonte

Respostas:

80

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-outside-of -aspnet-revisado-for-mvc3-rc.html
  2. No entanto, o Razor ainda está focado principalmente na geração de marcação do tipo xml (por exemplo, HTML) no sentido de que o analisador 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 corresponder às suposições do Razor sobre quais são suas intenções.

Então, por exemplo, embora este seja um código Razor válido (por causa da <div>tag):

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

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

@if(printHello) {
   Hello!
}

No entanto, há uma <text>tag especial que pode ser usada para forçar uma transição para blocos multilinhas (a <text>tag não será renderizada):

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

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

@if(printHello) {
   @:Hello!
}
Marcind
fonte
2
Bem, eu estava pensando em usá-lo para gerar coisas como e-mails ou geração de código IronPython on-the-fly. Uma vez que eles não usam tags, é provavelmente melhor olhar para outras alternativas. Obrigado pela resposta.
Thomas,
6
O @Thomas Razor deve funcionar bem nesses cenários, você apenas terá que adicionar essas <text>tags mágicas ou usar de @:vez em quando. Assim que o suporte ao editor VS for lançado para a sintaxe do Razor, será muito fácil dizer quando as transições ocorrem.
marcind
34

Verifique RazorEngine , é uma pequena estrutura construída em cima do Razor que permite que você faça isso.

Ariel
fonte
Teve problemas ao instalar este projeto no aplicativo de segmentação .net 4, requer atualizações.
Johnny_D
22

Dê uma olhada na biblioteca RazorTemplates . É mais leve do que a biblioteca RazorEngine, é thread-safe e tem 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" }));
alexey
fonte
1
Você está destacando a segurança da rosca do RazorTemplates b / c uma das outras soluções sugeridas para esta questão não é? Estou interessado especificamente no RazorEngine.
Steve Scheffler
9

Tanto o RazorEngine quanto o RazorTemplates já foram mencionados aqui, mas uma olhada no RazorMachine . Você pode simplesmente apontar seu aplicativo não MVC para uma pasta ~ / Views de (outro) aplicativo MVC existente, executar enviando o modelo adequado e obter a 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);
Antonin Jelinek
fonte
3

Gerar código ou texto: você quer dizer como os Modelos T4: http://msdn.microsoft.com/en-us/library/bb126445.aspx ou ferramentas codesmith?

Brian Mains
fonte
Isso precisa de votos positivos porque o T4 tem semelhanças com o Razor e é um gerador de código multifuncional real que vem pronto para uso como um recurso no Visual Studio - essencialmente, é um 'Razor' multifuncional
Dan Ling
É meu entendimento que os modelos T4 só podem ser alterados em tempo de compilação, o arquivo .tt é convertido e salvo como um arquivo .cs. No meu uso, um usuário semitécnico gostaria de atualizar o modelo sem ter que reconstruir o aplicativo. Existe uma maneira fácil de fazer isso usando os modelos T4?
daveb
Bem, possivelmente, desde que o que quer que esteja gerando possa ser interpretado, como o CSHTML pode ser pelo mecanismo Razor em tempo de execução. Você também pode acioná-lo de forma programável para gerar código, mas o código compilado deve ser analisado pelo compilador para ser utilizável ....
Brian Mains