Изменяйте Asp. Net Core RazorViewEngineOptions при каждом запросе - PullRequest
0 голосов
/ 05 мая 2020

У моего веб-сайта несколько тем, и каждая тема имеет разные представления, которые хранятся в папке 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);
    });
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...