【问题标题】:Convert a partial view to HTML 2019将部分视图转换为 HTML 2019
【发布时间】:2019-12-14 09:34:05
【问题描述】:

已经在这几个星期了。一些简单的事情无缘无故变得非常困难。我要做的就是返回部分视图的 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-views asp.net-mvc-partialview


    【解决方案1】:

    我已经做了这门课:

    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();
            }
        }
    }
    

    您可以将其添加到IServiceCollection 作为Scoped

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      相关资源
      最近更新 更多