uso i seguenti tipi iniettato dalla IServiceProvider
:
ICompositeViewEngine viewEngine;
ITempDataProvider tempDataProvider;
IHttpContextAccessor httpContextAccessor;
rendo il contenuto utilizzando il seguente metodo:
private async Task<string> RenderView(string path, ViewDataDictionary viewDataDictionary, ActionContext actionContext)
{
using (var sw = new System.IO.StringWriter())
{
var viewResult = viewEngine.FindView(actionContext, path);
var viewContext = new ViewContext(actionContext, viewResult.View, viewDataDictionary, new TempDataDictionary(httpContextAccessor, tempDataProvider), sw);
await viewResult.View.RenderAsync(viewContext);
sw.Flush();
if (viewContext.ViewData != viewDataDictionary)
{
var keys = viewContext.ViewData.Keys.ToArray();
foreach (var key in keys)
{
viewDataDictionary[key] = viewContext.ViewData[key];
}
}
return sw.ToString();
}
}
mi chiamano così:
var path = "~/Views/Home/Index.cshtml";
var viewDataDictionary = new ViewDataDictionary(new Microsoft.AspNet.Mvc.ModelBinding.EmptyModelMetadataProvider(), new Microsoft.AspNet.Mvc.ModelBinding.ModelStateDictionary());
var actionContext = new ActionContext(httpContextAccessor.HttpContext, new Microsoft.AspNet.Routing.RouteData(), new ActionDescriptor());
viewDataDictionary.Model = null;
var text = await RenderView(path, viewDataDictionary, actionContext);
Naturalmente, le mie variabili viewDataDictionary
e actionContext
sono impostate da un altro metodo per l'incapsulamento. Una modifica alla linea new ViewDataDictionary
può comportare il collegamento di un Modello tipizzato alla vista, se lo si desidera.
Questo codice utilizza utilizzi pesanti, penso di averli elencati di seguito. Altrimenti, VS2015 è abbastanza buono nel trovarli.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
Questo è stato scritto in beta-3; continua a crescere, ma alcune cose potrebbero cambiare. Cercherò di tornare qui per aggiornare se lo fa.
Si desidera inserire il contenuto HTML di un'azione su una variabile stringa? O semplicemente esegui un ActionResult in un'altra vista? –
@FabioLuz Voglio renderizzare la vista e inserire il codice HTML reso all'interno di una variabile stringa. – user1620696
Se vuoi farlo mentre sei sotto MVC 6, dovrebbe essere abbastanza semplice. È solo questione di ottenere la giusta dipendenza per migliorare la vista del rasoio. Tuttavia, se si è al di fuori di esso, ecco un esempio: https://github.com/tugberkugurlu/RazorOnConsole/blob/34c2e308f1976680c654a06a066b6c7fda1387b6/RazorTemplatingSample.Console/Program.cs#L15 scavare per vedere come 'Templater.Run' è implementato. – tugberk