Se conoce cómo generar un HTML de una vista parcial dada en el motor de vista ASP.NET .
Pero si esta funcionalidad se usa en la vista parcial de la maquinilla de afeitar, no funciona, ya que la excepción dice que la vista parcial no se deriva de "UserControl".
¿Cómo arreglar el renderizado para admitir la vista parcial de la maquinilla de afeitar?
Necesito esto porque genero correos electrónicos a partir de estas vistas parciales ...
ACTUALIZAR:
Código que falla (@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
fuente
fuente
Respuestas:
Actualizar
fuente
Aunque ya se han dado las respuestas adecuadas, me gustaría proponer una solución menos detallada, que se puede utilizar sin los métodos auxiliares disponibles en una clase de controlador MVC. Usando una biblioteca de terceros llamada "RazorEngine", puede usar el archivo .Net IO para obtener el contenido del archivo de afeitar y llamar
Obtenga la biblioteca de terceros aquí .
fuente
También puede usar el
RenderView Controller extension
desde aquí ( fuente )y utilícelo así:
funciona para motores de visualización de formularios web y de afeitar
fuente
Vi que alguien se preguntaba cómo hacerlo para otro controlador.
En mi caso, tenía todas mis plantillas de correo electrónico en la carpeta Vistas / Correo electrónico, pero podría modificar esto para pasar el controlador al que tiene vistas asociadas.
Básicamente, lo que hace es tomar un controlador, como AccountController, y modificarlo para pensar que es un EmailController para que el código se vea en la
Views/Email
carpeta. Es necesario hacer esto porque elFindView
método no toma una ruta directa como parámetro, quiere unControllerContext
.Una vez que ha terminado de representar la cadena, devuelve el AccountController a su estado inicial para que lo utilice el objeto Response.
fuente
gran código; pequeña pista: si a veces tienes que omitir más datos y no solo el modelo de vista ..
fuente
Tomando prestada la respuesta de @jgauffin como una extensión HtmlHelper:
Uso en una vista de navaja:
fuente