É 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.

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!
}

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.


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

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

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?


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.