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. MVC PHP架构 博客论坛实现全过程

    目录 1. MVC的历史 1.1 优点与缺点 1.1.1 优点 1.1.2 缺点 2. 个人博客论坛的MVC实现 2.1 前言 2.2 web代码结构 框架 2.2.1 web应用发展 2.2.2 C ...

  2. Value error: 'ascii' codec can't decode byte 0xe6 in position 26: ordinal not in range(128) The traceback for the exception was written to the log file

    原因:工作空间中有中文编码问题,导致的运行ros异常 解决办法: 1.解决urdf生成异常问题 urdf文件中不允许有中文,所有当输入中文的时候容易出问题,解决方案: ①在根目录下:/opt/ros/ ...

  3. List<Map<String,Object>> 属性获取

    public static void main(String[] args) { // 1.数据准备 List<Map<String,Object>> list = new A ...

  4. 12万字的java面试题及答案整理(2024新版)

    前言 本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧.好记 ...

  5. chcapter 2 量子力学介绍

    2.4.3  约化密度矩阵 对于A,B 构成的两体系统,A的约化密度矩阵可通过对系统B partial trace: 具体的操作为:首先把 AB 密度矩阵写成所有 ' 基矩阵叠加' 的展开形式,即每一 ...

  6. Vulhub Nginx漏洞复现

    目录 前言 文件名逻辑漏洞(CVE-2013-4547) 配置不当导致解析漏洞 配置错误导致漏洞 CRLF注入漏洞 目录穿越漏洞 前言 Nginx是一款广泛使用的Web服务器和反向代理服务器,尽管它以 ...

  7. Linux中find命令详解

    find命令 find 命令用于查找文件或目录 语法格式: find ./ -type f -name '文件名' 参数依次是:find命令,这里的./指的是当前路径,-type是选择文件类型,文件类 ...

  8. 一、FreeRTOS学习笔记-基础知识

    一基础知识 1.任务调度(调度器) 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务 FreeRTOS三种任务调度方式: 1.抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优 ...

  9. Django之跨域

    解决跨域请求问题可以从前端解决也可以通过配置后台解决,通过配置后台允许跨域可以解决前端的一些麻烦.Django通过中间件实现允许跨域. 1.安装django-cors-headers中间件 pip i ...

  10. CudaSPONGE之Python接口

    技术背景 在上一篇博客中我们介绍了CudaSPONGE的基本安装和使用方法.为了性能考虑,CudaSPONGE是基于纯CUDA C开发的,但是现在很多轮子都是Python开发的.为兼容更多的框架和平台 ...