É conhecido como gerar um HTML de uma determinada exibição parcial no mecanismo de exibição ASP.NET .
Mas se essa funcionalidade for usada na visualização parcial do razor, ela não funcionará, pois a exceção diz que a visualização parcial não deriva de "UserControl".
Como consertar a renderização para oferecer suporte à visão parcial de navalha?
Eu preciso disso porque eu gero e-mails a partir dessas visualizações parciais ...
ATUALIZAR:
Código que falha (@mcl):
public string RenderPartialToString(string controlName, object viewData)
{
ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
viewPage.Url = this.GetUrlHelper();
string fullControlName = "~/Views/Email/" + controlName + ".ascx";
viewPage.ViewData = new ViewDataDictionary(viewData);
viewPage.Controls.Add(viewPage.LoadControl(fullControlName));
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
}
return sb.ToString();
}
c#
asp.net-mvc
razor
Peter Stegnar
fonte
fonte
Respostas:
Atualizar
fonte
Embora respostas adequadas já tenham sido dadas, eu gostaria de propor uma solução menos prolixo, que pode ser usada sem os métodos auxiliares disponíveis em uma classe de controlador MVC. Usando uma biblioteca de terceiros chamada "RazorEngine", você pode usar o arquivo .Net IO para obter o conteúdo do arquivo do razor e chamar
Obtenha a biblioteca de terceiros aqui .
fonte
Você também pode usar a
RenderView Controller extension
partir daqui ( fonte )e use-o assim:
funciona para mecanismos de visualização de navalha e formulários da web
fonte
Eu vi que alguém estava se perguntando como fazer isso para outro controlador.
No meu caso, eu tinha todos os meus modelos de email na pasta Views / Email, mas você poderia modificar isso para passar o controlador ao qual você tem views associadas.
Essencialmente, o que isso faz é pegar um controlador, como AccountController, e modificá-lo para pensar que é um EmailController para que o código apareça na
Views/Email
pasta. É necessário fazer isso porque oFindView
método não pega um caminho direto como parâmetro, ele quer umControllerContext
.Depois de renderizar a string, ele retorna o AccountController ao seu estado inicial para ser usado pelo objeto Response.
fonte
ótimo código; dica: se às vezes você tem que ignorar mais dados e não apenas o modelo de visualização ..
fonte
Emprestando a resposta @jgauffin como uma extensão HtmlHelper:
Uso em uma visualização de navalha:
fonte