Usando o Razor em um Módulo DynamicWeb Customizado (PROVA DE CONCEITO)

Usando o Razor em um Módulo DynamicWeb Customizado (PROVA DE CONCEITO)

Sinto muito pelo meu péssimo inglês .. 🙁

Comecei a trabalhar com DynamicWeb (cms). Com DynamicWeb, você tem a capacidade
de desenvolver módulos personalizados para suas páginas. Esses módulos personalizados podem conter código C # personalizado, que você pode usar para desenvolver mais coisas personalizadas.

Quero dizer como você pode usar o barbeador em seus módulos.
Normalmente, você escreveria o código assim:

StringBuilder strBuiler = new StringBuilder();
strBuiler
.Append("<h1>" + model.Headline + "</h1>");
strBuiler
.Append("<hr />");
strBuiler
.Append("<ul>");
foreach (var name in model.Names)
{
strBuiler
.Append("<li>" + name + "</li>");
}
strBuiler
.Append("</ul>");

Esse código não é bonito ou fácil de corrigir. Se você trabalhou com ASP.net MVC e Razor, o resultado parecerá familiar:

@using CustomModules.HelloWorld //normal using
@inherits RazorEngine.Templating.TemplateBase<NameMViewodel> //Setting the Model

<h1>@Model.Headline</h1>
<hr />
<ul>
@foreach (var name in Model.Names)
{
<li>@name</li>
}
</ul>

Configurando

Para fazer isso eu preciso de 2 dependências

Quando eu adicionar essas 2 dependências ao meu projeto, estou pronto para criar algum tipo de carregador.

Estúdio visual

O Visual Studio não fica muito feliz em ter arquivos de barbear quando você não desenvolve um projeto MVC. Você pode contornar isso adicionando este código ao seu arquivo web.config:

<system.web>
<compilation>
<buildProviders>
<add extension=".cshtml" type="RazorEngine.Web.CSharp.CSharpRazorBuildProvider, RazorEngine.Web" />
<add extension=".vbhtml" type="RazorEngine.Web.VisualBasic.VBRazorBuildProvider, RazorEngine.Web" />
</buildProviders>
</compilation>
</system.web>

Se você executa no Medium Trust, dê uma olhada aqui: http://razorengine.codeplex.com/wikipage?title=Configuring%20RazorEngine%20for%20ASP.NET%20Medium%20Trust

Razor Loader

Eu construí uma pequena classe que pode ler um arquivo razor e retornar o HTML gerado:

public class RazorLoader
{
public string GenerateHtml<T>(string razorViewPath, T model)
{
string result;

using (Stream stream = new FileStream(
HttpContext.Current.Server.MapPath(razorViewPath),
FileMode.Open,
FileAccess.Read))
{
using (StreamReader reader = new StreamReader(stream))
{
result
= RazorEngine.Razor.Parse(reader.ReadToEnd(), model);
}
}

return result;
}
}

Usando isso!

Agora estou pronto para usar o carregador de navalha em um Módulo de Conteúdo:

public class NameMViewodel
{
public string Headline { get; set; }
public List<string> Names { get; set; }
}

[AddInName("RazorTester")]
public class RazorTester : ContentModule
{
public override string GetContent()
{
var model = new NameMViewodel
{
Headline = Properties["Headline"].ToString(),
Names = new List<String>() { "Oliver", "Kim", "Lars", "Micheal" }
};

return new RazorLoader().GenerateHtml("~/CustomModules/RazorTester/test.cshtml", model); ;
}
}

Conclusão

Faça! Parece funcionar .. 😉 Existem alguns recursos ausentes no RazorEngine, mas funciona básico.

Atualização 1

O RazorEngine pode ser muito lento se você não especificar um cacheName ao analisar o código do Razor.

Razor.Parse(razorTemplate, viewModel, cacheName);