Comment générer un HTML d'une vue partielle donnée sur le moteur de vue ASP.NET est connu .
Mais si cette fonctionnalité est utilisée sur une vue partielle de rasoir, elle ne fonctionne pas, car l'exception indique que la vue partielle ne dérive pas de "UserControl".
Comment réparer le rendu pour prendre en charge la vue partielle du rasoir?
J'en ai besoin car je génère des e-mails à partir de ces vues partielles ...
METTRE À JOUR:
Code qui échoue (@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
la source
la source
Réponses:
Mettre à jour
la source
Bien que des réponses adéquates aient déjà été données, j'aimerais proposer une solution moins verbeuse, qui peut être utilisée sans les méthodes d'assistance disponibles dans une classe de contrôleur MVC. En utilisant une bibliothèque tierce appelée "RazorEngine", vous pouvez utiliser le fichier .Net IO pour obtenir le contenu du fichier de rasoir et appeler
Obtenez la bibliothèque tierce ici .
la source
Vous pouvez également utiliser le à
RenderView Controller extension
partir d' ici ( source )et utilisez-le comme ceci:
cela fonctionne pour les moteurs d'affichage de rasoir et de formulaires Web
la source
J'ai vu que quelqu'un se demandait comment le faire pour un autre contrôleur.
Dans mon cas, j'avais tous mes modèles de courrier électronique dans le dossier Views / Email, mais vous pouvez le modifier pour passer au contrôleur auquel vous avez des vues associées.
Ce que cela fait essentiellement, c'est de prendre un contrôleur, tel que AccountController, et de le modifier pour qu'il pense que c'est un EmailController afin que le code regarde dans le
Views/Email
dossier. Il est nécessaire de le faire car laFindView
méthode ne prend pas un chemin direct en tant que paramètre, elle veut unControllerContext
.Une fois le rendu de la chaîne terminé, il renvoie le AccountController à son état initial pour être utilisé par l'objet Response.
la source
bon code; petit conseil: si vous devez parfois contourner plus de données et pas seulement le viewmodel ..
la source
Emprunter la réponse @jgauffin en tant qu'extension HtmlHelper:
Utilisation dans une vue rasoir:
la source