在ASP.NET 5类库中将Razor视图呈现为字符串

在ASP.NET 5类库中将Razor视图呈现为字符串,asp.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,Asp.net,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,我有ASP.NET 4.6 Web表单和ASP.NET核心网站。还有一个类库项目,在他们之间共享。我的目的是将与母版页相关的内容包含到驻留在类库中的视图组件中 我已经在类库中创建了母版页视图组件,并成功地将其调用到ASP.NET核心网站的共享布局视图中。下面是我关注的博客 我的下一个任务是以某种方式将母版页视图组件的扁平化HTML从类库导入ASP.NET4.6Web表单。我阅读了几个堆栈溢出问题,并遇到了下面的一个问题,它显示了如何在ASP.NET内核中将Razor视图呈现为字符串

我有ASP.NET 4.6 Web表单和ASP.NET核心网站。还有一个类库项目,在他们之间共享。我的目的是将与母版页相关的内容包含到驻留在类库中的视图组件中

我已经在类库中创建了母版页视图组件,并成功地将其调用到ASP.NET核心网站的共享布局视图中。下面是我关注的博客

我的下一个任务是以某种方式将母版页视图组件的扁平化HTML从类库导入ASP.NET4.6Web表单。我阅读了几个堆栈溢出问题,并遇到了下面的一个问题,它显示了如何在ASP.NET内核中将Razor视图呈现为字符串

        public string RenderPartialViewToString(string viewName, object model)
        {
            if (string.IsNullOrEmpty(viewName))
                viewName = ActionContext.ActionDescriptor.Name;

            ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                var engine = Resolver.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
                ViewEngineResult viewResult = engine.FindPartialView(ActionContext, viewName);

                ViewContext viewContext = new ViewContext(ActionContext, viewResult.View, 
                ViewData, TempData, sw, new HtmlHelperOptions());

                var t = viewResult.View.RenderAsync(viewContext);
                t.Wait();

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

下面是答案中的代码片段,我可以确认,如果我将此代码放在ASP.NET核心的控制器类中,它工作正常

        public string RenderPartialViewToString(string viewName, object model)
        {
            if (string.IsNullOrEmpty(viewName))
                viewName = ActionContext.ActionDescriptor.Name;

            ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                var engine = Resolver.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
                ViewEngineResult viewResult = engine.FindPartialView(ActionContext, viewName);

                ViewContext viewContext = new ViewContext(ActionContext, viewResult.View, 
                ViewData, TempData, sw, new HtmlHelperOptions());

                var t = viewResult.View.RenderAsync(viewContext);
                t.Wait();

                return sw.GetStringBuilder().ToString();
            }
        }
我的计划是将此代码移到类库项目中。但是,如果看到依赖项,它需要解析器(
IServiceProvider
),这是基类(Microsoft.AspNet.Mvc.Controller)中可用的公共属性


我的问题是如何将ASP.NET核心中的解析器或Razor视图引擎注入到类库项目中。因此,当ASP.NET 4.6 Web窗体为视图组件请求展开HTML时,类库将为其提供无障碍的服务。

依赖项注入在类库中的工作原理与在其他任何地方一样,您只需在类库类中获取构造函数依赖项即可,并且确保你在任何你需要的地方注入你的课程。只要所有依赖项都已注册,并且您一直在使用依赖项注入,即对所有内容使用DI,而不更新对象,就可以很好地将razor视图呈现为字符串,并使用构造函数依赖项从DI获取所需内容。我在另一个项目中使用它,这样我可以嗨,乔,谢谢你的投入。ViewRenderer类是否驻留在类库中?如果是,您如何请求它的实例,以便在其中实现所有必要的依赖关系?我怀疑,当我将类库作为DLL编译到我的ASP.NET 4.6 Web窗体中时,上下文将通过contextAccessor填充。我不知道如何与ASP.NET Web窗体集成。使用ASP.NET内核,我的控制器通过其构造函数从DI接收emailsender类,emailsender通过其构造函数接收ViewRenderer,ViewRenderer接收其构造函数所需的内容。这是对所有事物的依赖注入。只需在启动时注册所有需要的依赖项。不确定是否可以在webforms中这样做依赖项注入在类库中的工作方式与在其他任何地方相同,只需在类库类中获取所需的构造函数依赖项,并确保在任何需要的地方也注入类。只要所有依赖项都已注册,并且您一直在使用依赖项注入,即对所有内容使用DI,而不更新对象,就可以很好地将razor视图呈现为字符串,并使用构造函数依赖项从DI获取所需内容。我在另一个项目中使用它,这样我可以嗨,乔,谢谢你的投入。ViewRenderer类是否驻留在类库中?如果是,您如何请求它的实例,以便在其中实现所有必要的依赖关系?我怀疑,当我将类库作为DLL编译到我的ASP.NET 4.6 Web窗体中时,上下文将通过contextAccessor填充。我不知道如何与ASP.NET Web窗体集成。使用ASP.NET内核,我的控制器通过其构造函数从DI接收emailsender类,emailsender通过其构造函数接收ViewRenderer,ViewRenderer接收其构造函数所需的内容。这是对所有事物的依赖注入。只需在启动时注册所有需要的依赖项。不确定你是否可以在webforms中这样做