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();
}

asp.net core Theme 中间件的更多相关文章

  1. 如何传递参数给ASP.NET Core的中间件(Middleware)

    问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...

  2. asp.net core mvc 中间件之WebpackDevMiddleware

    asp.net core mvc 中间件之WebpackDevMiddleware WebpackDevMiddleware中间件主要用于开发SPA应用,启用Webpack,增强网页开发体验.好吧,你 ...

  3. asp.net core mvc 中间件之路由

    asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...

  4. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...

  5. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  6. ASP.NET Core路由中间件[3]: 终结点(Endpoint)

    到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...

  7. ASP.NET Core路由中间件[2]: 路由模式

    一个Web应用本质上体现为一组终结点的集合.终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系.借助这个映射关系,客户端可 ...

  8. ASP.NET Core:中间件

    一.什么是中间件 我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中.而中间件就是用于组成应用程序管道来处理请求和响应的 ...

  9. Asp.Net Core 通过中间件防止图片盗链

    一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...

  10. ASP.NET Core 开发-中间件(Middleware)

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

随机推荐

  1. 在vue中引入外部的css文件

    在vue中引入外部的css文件在项目的src文件下,新建一个style文件夹,存放css文件. 1. 全局引入将外部的css文件放到style文件下,引入外部文件只需在main.js文件中 impor ...

  2. mysql重置id排列重新排序

    1.删除表中的原有的主键字段 ALTER TABLE table2 DROP id 2.表中重新创建一个字段 ALTER TABLE table2 ADD id int NOT NULL FIRST; ...

  3. Java常见面试真题之中级进阶(HashMap篇)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Hashtable 与 HashMap 的区别?HashMap 中的 key 我们可以使用任何类作为 key 吗?HashMap 的长 ...

  4. Issac_GYM重要过程记录

    1 下载相关文件 进入github中下载相关的文件 https://github.com/leggedrobotics/legged_gym 2 加载自己绘制的URTL文件 这个链接用来下载宇树的Go ...

  5. spool参数详解

    SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等.可用SET命令改变这些系统变量,也可 ...

  6. cmu15545-数据存储(Database Storage)

    蓝图 数据库自己管理磁盘数据和缓冲区,而不是通过操作系统管理(Os is not your friend.). 三层视图 数据库以页(page)为存储数据的基本单位,文件(file)是一系列页的集合, ...

  7. Linux日志轮替与总结

    目录 基本介绍 轮替文件的命名 配置文件 路径位置 参数说明 举例:把自己的日志加入日志轮替 说明 步骤 日志轮替机制原理[个人理解,仅供参考] 总结[关于日志需要掌握的点] 基本介绍 日志轮替就是把 ...

  8. 使用Roslyn的源生成器生成DTO

    前言 源生成器的好处很多, 通过在编译时生成代码,可以减少运行时的反射和动态代码生成,从而提高应用程序的性能, 有时候需要对程序AOT以及裁剪编译的dll也是需要用SG来处理的. 我们开发程序应该都绕 ...

  9. HAL+CubeIDE,输入输出重定向

    ①将以下代码段复制到usart.c里: /******************************************************************************* ...

  10. 【一步步开发AI运动小程序】七、进行运动计时、计数

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...