我使用从IServiceProvider注入的以下类型:
ICompositeViewEngine viewEngine;
ITempDataProvider tempDataProvider;
IHttpContextAccessor httpContextAccessor;
我使用以下方法渲染内容:
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();
}
}
我这样称呼它:
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);
当然,我的viewDataDictionary和actionContext变量是通过另外一种封装方式设置的。如果您愿意,对new ViewDataDictionary 行的修改可能会导致类型化模型绑定到您的视图。
这段代码使用了大量的用法,我想我已经在下面列出了它们。否则,VS2015 很适合找到它们。
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
这是在 beta-3 下编写的;它仍在构建,但有些事情可能会改变。如果有,我会尝试回到这里更新。