użyć następujących typów wtryskiwany z IServiceProvider
:
ICompositeViewEngine viewEngine;
ITempDataProvider tempDataProvider;
IHttpContextAccessor httpContextAccessor;
renderować zawartości przy użyciu następującej metody:
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 połączyć ją w następujący sposób
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);
Oczywiście moje zmienne viewDataDictionary
i actionContext
są ustawiane za pomocą innego sposobu enkapsulacji. Modyfikacja linii new ViewDataDictionary
może spowodować, że wpisany model zostanie powiązany z Twoim widokiem, jeśli wybierzesz.
Ten kod używa ciężkich zastosowań, myślę, że wymieniono je poniżej. W przeciwnym razie VS2015 jest całkiem niezły w ich odnajdywaniu.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
Zostało to napisane w wersji beta-3; nadal się buduje, ale niektóre rzeczy mogą się zmienić. Spróbuję tu wrócić, żeby to zaktualizować.
Czy chcesz wstawić zawartość HTML akcji do zmiennej łańcuchowej? Lub po prostu render ActionResult wewnątrz innego widoku? –
@FabioLuz Chcę renderować widok i umieścić renderowany kod HTML wewnątrz zmiennej łańcuchowej. – user1620696
Jeśli chcesz to zrobić, gdy jesteś pod MVC 6, powinno być dość proste. To tylko kwestia uzyskania właściwej zależności, aby zwiększyć widok brzytwy. Jeśli jednak znajdujesz się poza nim, oto przykład: https://github.com/tugberkugurlu/RazorOnConsole/blob/34c2e308f1976680c654a06a066b6c7fda1387b6/RazorTemplatingSample.Console/Program.cs#L15, aby sprawdzić, jak działa 'Templater.Run' wdrożony. – tugberk