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
- System.Web.Razor
- RazorEngine ( http://nuget.org/packages/RazorEngine/ )
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);