Je veux faire une méthode d'extension dans helper, qui prend un seul paramètre partialViewName
et renvoie une vue partielle sous forme de chaîne. J'ai trouvé l'extension qui a été utilisé d'une action ASP.NET MVC commeAssistant d'extension personnalisé dans asp net mvc qui retourne vue partielle
return PartialView("NameOfPartial").ReturnToString();
Mais je veux le faire comme
string partialView = ViewExtensions.RenderToString("NameOfPartial");
Raison de le faire est que mon contrôleur doit être ApiController
, pas simple, donc il n'utilise pas
Voici une partie du code, que j'ai maintenant.
public static class ViewExtensions
{
public static string RenderToString(string partialViewName)
{
var httpContext = HttpContext.Current;
if (httpContext == null)
{
throw new NotSupportedException("An HTTP context is required to render the partial view to a string");
}
var controllerName = "Home"; // httpContext.Request.RequestContext.RouteData.Values["controller"].ToString();
var controller = (ControllerBase)ControllerBuilder.Current.GetControllerFactory().CreateController(httpContext.Request.RequestContext, controllerName);
var controllerContext = new ControllerContext(httpContext.Request.RequestContext, controller);
var view = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName).View;
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
using (var tw = new HtmlTextWriter(sw))
{
view.Render(new ViewContext(controllerContext, view, null, null, tw), tw);
}
}
return sb.ToString();
}
}
Peut-être que quelqu'un sait mieux comment le rendre plus facile, mieux et aussi travailler?
P.S Cet extrait de code renvoie l'exception et mon partiel est également dans le dossier Shared
(structure ASP.NET MVC de base).
semble simple et agréable, mais quelle référence me manque, ViewData et TempData ne sont pas définis dans le contexte actuel? Aussi je veux l'employer dans la classe d'aide comme méthode ant d'extension statique. – GrandaS
Vous avez besoin de System.IO et System.Web.Mvc comme références. – FreddieH
Si vous voulez en faire une méthode d'extension statique, la signature ressemblerait à ceci: chaîne statique publique RenderPartialViewToString (cette HtmlHelper htmlHelper, string viewName, modèle d'objet) { } –
FreddieH