【问题标题】:RenderViewToString conflictRenderViewToString 冲突
【发布时间】:2021-06-17 00:04:29
【问题描述】:

在 MVC 项目中,我使用以下代码将视图动态呈现为字符串。

public string RenderViewToString(string viewName, object model, RequestContext requestContext){
            ViewData.Model = model;
            var cContext = ControllerContext;
            if (cContext == null)
            {
                var ctrlFactory = ControllerBuilder.Current.GetControllerFactory();
                var ctrl = ctrlFactory.CreateController(requestContext, "Documents") as Controller;
                var newCContext = new ControllerContext(requestContext, ctrl);
                cContext = newCContext;
                var ctrlDesc = new ReflectedControllerDescriptor(ctrl.GetType());
            }
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindPartialView(cContext, viewName);
                var viewContext = new ViewContext(cContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);
                viewResult.ViewEngine.ReleaseView(cContext, viewResult.View);
                return sw.GetStringBuilder().ToString();
            }
        }

在多个用户同时运行代码之前,此方法运行良好。然后它将每个用户的视图数据混合在一起。

有什么建议吗?谢谢

【问题讨论】:

    标签: c# model-view-controller requestcontext


    【解决方案1】:

    我在使用类似代码时遇到了同样的问题。我花了几天时间弄清楚这个。 在阅读了这方面的负载后,包含诸如“编写自己的 viewRenderer”之类的建议,解决这个问题似乎很复杂。 在深入研究 .net 代码本身之后,我发现了一个可以解决此问题的肮脏技巧

    在您的 ConfigureServices(启动)中添加几行:

      services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
      services.AddTransient<IViewRenderer, ViewRenderer>();
    
      // reason for this registration https://github.com/aspnet/Mvc/issues/5106 . A scoped buffer causes overflow.
      var memoryPoolViewBufferScopeType = Type.GetType("Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.MemoryPoolViewBufferScope, Microsoft.AspNetCore.Mvc.ViewFeatures");
      if (memoryPoolViewBufferScopeType != null)
      {
        services.AddTransient(typeof(IViewBufferScope), memoryPoolViewBufferScopeType);
      }
    

    它使 IViewRenderer 和 IViewBufferScope 瞬态,从而解决了问题。 以这种方式添加 IViewBufferScope 的原因是因为它是内部的,因此需要一些技巧来获得它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2011-11-22
      • 2016-02-25
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多