首页 > 解决方案 > 将部分视图转换为 HTML 2019

问题描述

已经在这几个星期了。一些简单的事情无缘无故变得非常困难。我要做的就是返回部分视图的 HTML。为什么?

在 Azure 中的一页上呈现多个局部视图非常慢。它会导致 502 错误,并且您无法更改超时(感谢 Microsoft)。

一切都在我本地的开发中运行,移动到 Azure,而这主要的事情不起作用。我已经尝试了所有找到的示例。

问题是代码和方法似乎随着框架而改变。没有什么比 2018 年更新的了。所以要么没有人得到这项工作,要么部分观点基本上没用。这是我来过的最接近的,但 RazorViewEngine 不想解决。

private async Task<string> RenderPartialViewToString(string viewName, object model)
{

    RazorViewEngine _viewEngine = new RazorViewEngine();

    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.ActionDescriptor.ActionName;

    ViewData.Model = model;

    using (var writer = new StringWriter())
    {
        ViewEngineResult viewResult = _viewEngine.FindView(ControllerContext, viewName, false);

        ViewContext viewContext = new ViewContext(
            ControllerContext,
            viewResult.View,
            ViewData,
            TempData,
            writer,
            new HtmlHelperOptions()
        );

        await viewResult.View.RenderAsync(viewContext);

        return writer.GetStringBuilder().ToString();
    }
}

标签: c#partial-viewsasp.net-mvc-partialview

解决方案


我做了这门课:

public class ViewRenderService
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly HttpContext _http;

    public ViewRenderService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider, IHttpContextAccessor ctx)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _http = ctx.HttpContext;
        _http.RequestServices = serviceProvider;
    }

    public async Task<string> RenderToStringAsync(RouteData routeData, string viewName, object model)
    {
        var actionContext = new ActionContext(_http, routeData, new ActionDescriptor());

        using (var sw = new StringWriter())
        {
            var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
            // For views outside the usual Views folder
            if (viewResult.View == null)
            {
                throw new ArgumentNullException($"{viewName} does not match any available view");
            }
            var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
            {
                Model = model
            };
            var viewContext = new ViewContext(actionContext, viewResult.View, viewDictionary, new TempDataDictionary(_http, _tempDataProvider), sw, new HtmlHelperOptions());
            viewContext.RouteData = _http.GetRouteData();
            await viewResult.View.RenderAsync(viewContext);
            return sw.ToString();
        }
    }
}

您可以将其添加IServiceCollectionScoped.


推荐阅读