Изменение мест просмотра во время выполнения - PullRequest
0 голосов
/ 04 мая 2019

Я создаю приложение ASP.Net Core 2.1 MVC, и недавно я наткнулся на создание взаимозаменяемых тем для приложения ASP.Net MVC 6, используя файл web.config, чтобы настроить, какой механизм представления будет использоваться для обслуживания.представления, которые находятся в разных местах (в зависимости от выбранного двигателя представления).Вставив пользовательский механизм представления (который был просто расширением механизма представления бритвы с различными местоположениями пути для представления) перед механизмом представления бритвы, разработчик должен был только создать новые представления для тех, которые он хотел заменить в новой теме.и механизм представления по умолчанию будет по-прежнему возвращать любые представления, которые не нужно было изменять.Мне было интересно, есть ли способ изменить механизм представления или просто первый механизм представления, который будет использоваться для поиска представления во время выполнения, если пользователь выберет его из выпадающего списка во время работы приложения.Нам нужно, чтобы URL-адреса оставались одинаковыми между двумя темами, и я бы не хотел включать строки запросов, чтобы можно было выбрать тему.Чтобы уточнить, тема здесь больше, чем просто изменение цветовой схемы.Макет страницы и содержимое страницы также изменятся.Я попытался подать один элемент IServiceCollection на контроллеры, чтобы изменить формат расположения представления, но, к сожалению, это происходит только при первом запуске приложения.Я уверен, что это кажется странным запросом, но мы хотим, чтобы тестировщики могли изменять темы представлений на их конце с помощью пользовательского интерфейса, а не вносить изменения в файлы запуска или конфигурации.Я связался с тем, где я впервые наткнулся на эту идею Темы;однако, это требует лицензии Pluralsight.Я включил соответствующие фрагменты кода в качестве примера.

https://app.pluralsight.com/player?course=mvc-applications-10-extension-points-improving&author=alex-wolf&name=mvc-applications-10-extension-points-improving-m5&clip=2&mode=live

protected void Application_Start()
{
    if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["ActiveTheme"]))
    {
        var activeTheme = ConfigurationManager.AppSettings["ActiveTheme"];
        ViewEngines.Engines.Insert(0, new ThemeViewEngine(activeTheme));
    };

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}
public class ThemeViewEngine : RazorViewEngine
{
    public ThemeViewEngine(string activeThemeName)
    {
         ViewLocationFormats = new[]
         {
             "~/Views/Themes/" + activeThemeName + "/{1}/{0}.cshtml",
             "~/Views/Themes/" + activeThemeName + "/Shared/{0}.cshtml"
         };

         PartialViewLocationFormats = new[]
         {
             "~/Views/Themes/" + activeThemeName + "/{1}/{0}.cshtml",
             "~/Views/Themes/" + activeThemeName + "/Shared/{0}.cshtml"
         };

         AreaViewLocationFormats = new[]
         {
             "~Areas/{2}/Views/Themes/" + activeThemeName + "/{1}/{0}.cshtml",
             "~Areas/{2}/Views/Themes/" + activeThemeName + "/Shared/{0}.cshtml"
         };

         AreaPartialViewLocationFormats = new[]
         {
             "~Areas/{2}/Views/Themes/" + activeThemeName + "/{1}/{0}.cshtml",
             "~Areas/{2}/Views/Themes/" + activeThemeName + "/Shared/{0}.cshtml"
         };
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...