AspNetCore RazorEngine不会使用派生IOptions中配置的FileProviders

问题描述 投票:0回答:1

用例分离的模板引擎,在AspNetCore(2.X)Web应用程序中不会以任何方式干扰正常的Razor操作。

问题在尝试实现上述内容时,我已经创建了一大堆基于RazorViewEngine,RazorViewCompilerProvider,DefaultRazorPageFactoryProvider,DefaultRazorViewEngineFileProviderAccessor和RazorViewEngineOptions的派生类,努力这些可以在DI中注册并注入,同时在正常情况下没有副作用剃刀代码路径。除了一个恼人的问题,我已经成功了,我仍然需要在普通的RazorViewEngineOptions而不是我的包装类中配置我的自定义FileProvider(TemplateRepository)。

例如在下面的Startup.cs代码中,即使在我的自定义Options对象中指定了文件提供程序,并且这是注入到包装类中的内容,也不会为View请求调用TemplateRepository,除非第二个service.Configure也是包括(使用RazorViewEngineOptions)。

services.Configure<TemplateOptions>(options =>
        {
            options.ViewLocationExpanders.Add(new TemplateNameExpander());
            options.ViewLocationFormats.Add("{0}");
            options.AreaViewLocationFormats.Add("{0}");
            options.FileProviders.Clear();
            options.FileProviders.Add(new TemplateRepository(new SqlConnectionFactory(configuration)));
        });

services.Configure<RazorViewEngineOptions>(
            options =>
            {
                options.FileProviders.Add(new TemplateRepository(new SqlConnectionFactory(configuration)));
            });

这会告诉我,在RazorViewEngine依赖树中的某个地方RazorViewEngineOptions正在某处注入,但我找不到它。

完整来源@ GitHub

razor asp.net-core-mvc asp.net-core-2.0
1个回答
0
投票

您似乎已经定义了自定义RazorViewEngine,但是您没有告诉MVC使用它。

尝试添加以下代码以将模板RazorEngine添加到MVC视图引擎。

services.Configure<TemplateOptions>(options =>
        {
            options.ViewLocationExpanders.Add(new TemplateNameExpander());
            options.ViewLocationFormats.Add("{0}");
            options.AreaViewLocationFormats.Add("{0}");
            options.FileProviders.Clear();
            options.FileProviders.Add(new TemplateRepository(new SqlConnectionFactory(configuration)));
        }); 

        services.Configure<MvcViewOptions>(options => {
            var engine = services.BuildServiceProvider().GetRequiredService<TemplateRazorEngine>();
            options.ViewEngines.Add(engine);
        });
© www.soinside.com 2019 - 2024. All rights reserved.