用例分离的模板引擎,在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
您似乎已经定义了自定义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);
});