我正在创建一个ASP.Net Core 2.1 MVC应用程序,最近我遇到了通过使用web.config文件配置将用于服务哪个自定义视图引擎的ASP.Net MVC 6应用程序可互换主题的问题。位于不同位置的视图(取决于所选的视图引擎)。通过在razor视图引擎之前插入自定义视图引擎(这只是razor视图引擎的扩展,具有不同的视图路径位置),开发人员只需为要替换的主题创建新视图即可。并且默认视图引擎仍将返回不需要更改的任何视图。我想知道是否存在一种方法,可以通过在运行应用程序时让用户从下拉菜单中选择视图引擎来更改视图引擎,或者仅使用第一个视图引擎来在运行时查找视图。我们需要两个主题之间的URL保持相同,并且我不希望包含查询字符串以能够选择主题。为了澄清,这里的主题不仅仅是更改配色方案。页面的布局和页面的内容也会改变。我尝试将IServiceCollection的一个实例提供给控制器,以更改视图位置格式,但是可悲的是,这仅是在应用程序首次启动时。我确定这似乎是一个奇怪的请求,但我们希望能够让测试人员通过UI更改其端视图的主题,而不必继续在启动或配置文件中进行更改。我已经链接到我第一次遇到这个主题概念的地方。但是,它需要Pluralsight许可证。我以相关的代码片段为例。
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"
};
}
}