AspNetCore RazorEngine не будет использовать FileProviders, настроенные в производных IOptions <RazorViewEngineOptions> - PullRequest
0 голосов
/ 28 февраля 2019

Вариант использования Отдельный шаблонизатор, который никак не мешает нормальной работе Razor в веб-приложении AspNetCore (2.X).

Проблема * 1006Пытаясь реализовать вышеизложенное, я создал целую кучу производных классов-оболочек, основанных на RazorViewEngine, RazorViewCompilerProvider, DefaultRazorPageFactoryProvider, DefaultRazorViewEngineFileProviderAccessor и RazorViewEngineOptions, в попытке, что они могут быть зарегистрированы с помощью DI, а также могут быть добавлены, если они не являются обычными.Путь кода бритвы.Я преуспел, за исключением одной раздражающей проблемы, из-за которой мне все еще нужно настроить мой пользовательский FileProvider (TemplateRepository) в пределах обычных RazorViewEngineOptions, а не в моем классе-обертке.

Например, в приведенном ниже коде из Startup.cs, даже если в моем пользовательском объекте параметров указан поставщик файлов, и именно это внедряется в классы-оболочки, TemplateRepository не вызывается для запроса на просмотр, если толькоВторой сервис. Настройка также включена (с помощью 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

1 Ответ

0 голосов
/ 01 марта 2019

Похоже, что вы определили свой пользовательский RazorViewEngine, но не указали MVC использовать его.

Попробуйте добавить приведенные ниже коды для добавления TemplateRazorEngine в механизм просмотра 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);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...