É possível utilizar uma view do ASP.NET MVC Razor como um template para gerar um html. Isso pode ser utilizado por exemplo para você ter um template padrão HTML do texto de um e-mail, que é preenchido em tempo de execução com os dados do usuário antes do envio do e-mail, ou então você pode ter um HTML padrão que deve ser preenchido com dados para cada item de um grid e esses dados são carregado através de Ajax.
Os passos para realizar esse processo são os seguintes:
Abaixo, um exemplo de como imprimindo na página o Html gerado a partir do template do Razor:
1- Crie um projeto ASP.NET MVC vazio com o padrão de ViewEngine “Razor”
2- Instale o RazorEngine no seu projeto, você pode fazer isso de duas formas:
a) Adicionando as referências manualmente no seu projeto, depois de baixar os arquivos em:
http://razorengine.codeplex.com/
b) Utilizando o nuget, que é o processo mais fácil e que eu recomendo:
3- Crie uma Controller com o nome “HomeController”
4- Crie uma ViewModel com o nome “EmailLembreteSenha”
public class EmailLembreteSenha
{
public string UsuarioNome { get; set; }
public string UsuarioSenha { get; set; }
public DateTime DataSolicitacao { get; set; }
}
5- Compile a aplicação, para que a nova ViewModel apareça no wizard de criação de Views
6- Crie uma View com o nome “TemplateEmailLembreteSenha” utilizando como “Model class” a classe “EmailLembreteSenha”
O código dessa View será o seguinte:
@model TemplateRazorTest.ViewModel.EmailLembreteSenha
<p>Prezado(a) @Model.UsuarioNome,</p>
<br /><br />
<p>Atendendo à sua solicitação realizada em: @Model.DataSolicitacao.ToShortDateString(), estamos enviando sua senha de acesso</p>
<p>Senha: @Model.UsuarioSenha</p>
<br /><br />
<p>
Atenciosamente,<br />
administrador
</p>
7- Na HomeController, adicione o seguinte código:
public ActionResult Index()
{
ViewModel.EmailLembreteSenha model = new ViewModel.EmailLembreteSenha();
model.UsuarioNome = "Eduardo Coutinho";
model.UsuarioSenha = "123";
model.DataSolicitacao = DateTime.Now;
string viewCode = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/Views/TemplateEmailLembreteSenha.cshtml"));
if (viewCode.IndexOf("@model ") != -1)
viewCode = string.Concat(viewCode.Substring(0, viewCode.IndexOf("@model ")), viewCode.Substring(viewCode.IndexOf("\r\n", viewCode.IndexOf("@model "))));
string html = RazorEngine.Razor.Parse(viewCode, model);
//Imprime na view
ViewBag.HTML = html;
return View();
}
ViewModel.EmailLembreteSenha model = new ViewModel.EmailLembreteSenha();
model.UsuarioNome = "Eduardo Coutinho";
model.UsuarioSenha = "123";
model.DataSolicitacao = DateTime.Now;
string viewCode = System.IO.File.ReadAllText(HttpContext.Server.MapPath("Views/TemplateEmailLembreteSenha.cshtml"));
if (viewCode.IndexOf("@model ") != -1)
viewCode = string.Concat(viewCode.Substring(0, viewCode.IndexOf("@model ")), viewCode.Substring(viewCode.IndexOf("\r\n", viewCode.IndexOf("@model "))));
A instrução @model não é interpretada pelo RazorEngine então precisa ser removida, senão ocorrerá o seguinte erro:
string html = RazorEngine.Razor.Parse(viewCode, model);
Depois dessa instrução, a variável “html” conterá o html final para envio do e-mail (juntando o template e os dados do usuário).
ViewBag.Html = html;
return View();
Os próximos passos complementam a apresentação desse HTML na página, para efeitos de teste:
8- No código anterior, clique sobre o botão direito do mouse em “return View();” escolha a opção “Add View” e crie uma View “Index”, que não precisa fazer bind com nenhuma ViewModel, adicione nessa view o código abaixo:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
Template:
<div style="border: 1px solid black; width: 400px">
@Html.Raw(ViewBag.Html)
</div>
</body>
</html>
9- Ao executar o projeto, será exibido o HTML do template preenchido com os dados da Model: