ich die folgenden Typen von IServiceProvider
injiziert:
ICompositeViewEngine viewEngine;
ITempDataProvider tempDataProvider;
IHttpContextAccessor httpContextAccessor;
I machen, den Inhalt der folgenden Methode:
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();
}
}
I es so nennen:
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);
Natürlich werden meine viewDataDictionary
und actionContext
Variablen durch eine andere Methode für die Kapselung gesetzt. Eine Änderung an der Zeile new ViewDataDictionary
kann dazu führen, dass ein typisiertes Modell an Ihre Ansicht gebunden wird, wenn Sie dies wünschen.
Dieser Code verwendet schwere usings, ich denke, ich habe sie unten aufgeführt. Ansonsten ist VS2015 ziemlich gut darin, sie zu finden.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
Dies wurde unter Beta-3 geschrieben; Es baut immer noch, aber einige Dinge können sich ändern. Ich werde versuchen, hierher zu kommen, um zu aktualisieren, wenn es das tut.
Haben Sie den HTML-Inhalt einer Aktion auf eine String-Variable eingefügt werden soll? Oder einfach ein ActionResult in einer anderen Ansicht rendern? –
@FabioLuz Ich möchte die Ansicht rendern und den gerenderten HTML-Code in eine String-Variable einfügen. – user1620696
Wenn Sie dies tun möchten, während Sie unter MVC 6 sind, sollte es ziemlich geradlinig sein. Es kommt nur darauf an, die richtige Abhängigkeit zu bekommen, um die Rasierklingenansicht auszuweiten. Wenn Sie jedoch außerhalb davon sind, hier ist ein Beispiel: https://github.com/tugberkugurlu/RazorOnConsole/blob/34c2e308f1976680c654a06a066b6c7fda1387b6/RazorTemplatingSample.Console/Program.cs#L15 eingraben, um zu sehen, wie 'Templater.Run' ist implementiert. – tugberk