2015-12-03 1 views
1

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).

Répondre

1

Ceci est une implémentation que nous utilisons souvent.

protected string RenderPartialViewToString(string viewName, object model) 
    { 
     var view = viewName; 
     if (string.IsNullOrEmpty(view)) 
     { 
      view = ControllerContext.RouteData.GetRequiredString("action"); 
     } 

     ViewData.Model = model; 

     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, view); 
      var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 

      viewResult.View.Render(viewContext, sw); 

      return sw.GetStringBuilder().ToString(); 
     } 
    } 
+0

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

+0

Vous avez besoin de System.IO et System.Web.Mvc comme références. – FreddieH

+0

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

-1

Référez-dessous la mise en œuvre:

ViewEngineResult viewEngResult = null;

viewEngResult = ViewEngines.Engines.FindPartialView (Contexte ControllerContext, PartialViewPath);

var engineView = viewEngResult.View;