asp.net core Theme 中间件
asp.net core中自定义视图引擎,继承接口 IViewLocationExpander
public class ThemeViewLocationExpander : IViewLocationExpander { public const string ThemeKey = "Theme"; public void PopulateValues(ViewLocationExpanderContext context) { string theme = context.ActionContext.HttpContext.Items[ThemeKey].ToString(); context.Values[ThemeKey] = theme; } public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { string theme; if (context.Values.TryGetValue(ThemeKey, out theme)) { viewLocations = new[] { $"/Themes/{theme}/Views/{{1}}/{{0}}.cshtml", $"/Themes/{theme}/Views/Shared/{{0}}.cshtml", $"/Themes/{theme}/Areas/{{2}}/Views/{{1}}/{{0}}.cshtml", $"/Themes/{theme}/Areas/{{2}}/Views/Shared/{{0}}.cshtml", } .Concat(viewLocations); } return viewLocations; } }
新建中间件ThemeMiddleware
public class ThemeMiddleware { private readonly RequestDelegate _next; public IConfiguration _configuration; public ThemeMiddleware(RequestDelegate next, IConfiguration configuration) { _next = next; _configuration = configuration; } public Task Invoke(HttpContext context) { var folder = _configuration.GetSection("theme").Value; context.Request.HttpContext.Items[ThemeViewLocationExpander.ThemeKey] = folder ?? "Default"; return _next(context); } }
中间件扩展
public static class MiddlewareExtensions { /// <summary> /// 启用Theme中间件 /// </summary> /// <param name="builder"></param> /// <returns></returns> public static IApplicationBuilder UseTheme(this IApplicationBuilder builder) { return builder.UseMiddleware<ThemeMiddleware>(); } }
中间件服务扩展
public static class ServiceCollectionExtensions { /// <summary> /// 添加Theme服务 /// </summary> /// <param name="services"></param> /// <returns></returns> public static IServiceCollection AddTheme(this IServiceCollection services) { return services.Configure<RazorViewEngineOptions>(options => { options.ViewLocationExpanders.Add(new ThemeViewLocationExpander()); }); } }
使用:
public void ConfigureServices(IServiceCollection services) { services.AddTheme(); //添加Theme服务 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseTheme();//启用theme中间件 app.UseMvcWithDefaultRoute(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)