У моего веб-сайта несколько тем, и каждая тема имеет разные представления, которые хранятся в папке Themes / {theme-name} / Views. Когда мы обновляем тему в базе данных, конвейер запросов должен заменить настроенный путь razorviewengineoptions на путь выбранной темы, который может быть Themes / theme-name2 / Views. Мы пытаемся настроить RazorViewEngineOptions на контроллере, внедрив IServiceCollection, установив его как одноэлементный объект в методе ConfigureServices файла Startup.cs. После повторной настройки RazorViewEngineOptions в запросе контроллера, изменив его на новый путь, RazorViewEngineOptions не обновляется, и ничего не происходит.
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper(typeof(Startup));
services.AddControllersWithViews().AddRazorRuntimeCompilation();
services.AddSingleton<IServiceCollection>(services);
string theme = Configuration[AppSetting.DefaultWebsiteTheme];
services.Configure<RazorViewEngineOptions>(option =>
{
option.ViewLocationFormats.Clear();
option.ViewLocationFormats.Add("/Themes/" + theme + "/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
option.ViewLocationFormats.Add("/Themes/" + theme + "/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
option.PageViewLocationFormats.Clear();
option.PageViewLocationFormats.Add("/Themes/" + theme + "/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
option.PageViewLocationFormats.Add("/Themes/" + theme + "/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
});
}
public DashboardController(IUnitOfWork unitOfWork, IMapper mapper, IConfiguration config, IServiceCollection services, IServiceProvider serviceProvider) : base(unitOfWork, mapper)
{
this.config = config;
string theme = GetThemeSelected(unitOfWork);
var razorviewengineOptions = serviceProvider.GetService<IOptions<RazorViewEngineOptions>>();
services.Configure<RazorViewEngineOptions>(option =>
{
option.ViewLocationFormats.Clear();
option.ViewLocationFormats.Add("/Themes/" + theme + "/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
option.ViewLocationFormats.Add("/Themes/" + theme + "/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
option.PageViewLocationFormats.Clear();
option.PageViewLocationFormats.Add("/Themes/" + theme + "/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
option.PageViewLocationFormats.Add("/Themes/" + theme + "/Views/Shard/{0}" + RazorViewEngine.ViewExtension);
});
}