通过实现IViewLocationExpander接口可自定义Razor视图查找路径,如根据theme参数动态调整。PopulateValues提取上下文值用于缓存键,ExpandViewLocations插入新视图路径。注册后支持多主题、多语言或模块化结构,提升视图加载灵活性。

在 ASP.NET Core 中,视图位置扩展器(View Location Expanders)允许你自定义 Razor 视图的查找路径。默认情况下,MVC 会按照约定在 Views/[Controller]/[Action].cshtml 或 Pages/[Page].cshtml 等位置查找视图。但通过实现 IViewLocationExpander 接口,你可以动态修改这些查找规则,比如支持多语言、主题切换或模块化结构。
实现 IViewLocationExpander 接口
要创建自定义视图位置扩展器,需实现 IViewLocationExpander 接口中的两个方法:ExpandViewLocations 和 PopulateValues。
下面是一个示例:根据路由参数或查询字符串中的“theme”值来改变视图查找路径:
public class ThemeViewLocationExpander : IViewLocationExpander
{
// 将上下文中的信息提取为键值对,用于缓存键生成
public void PopulateValues(ViewLocationExpanderContext context)
{
var theme = context.ActionContext.HttpContext.Request.Query["theme"].ToString();
if (string.IsNullOrEmpty(theme))
{
theme = context.ActionContext.RouteData.Values["theme"]?.ToString();
}
context.Values["theme"] = theme ?? "default";
}
// 自定义视图查找路径
public IEnumerable<string> ExpandViewLocations(
ViewLocationExpanderContext context,
IEnumerable<string> viewLocations)
{
if (context.Values.TryGetValue("theme", out var theme) && !string.IsNullOrEmpty(theme))
{
// 在原有路径前插入主题专属路径
var themeLocation = $"/Themes/{theme}/Views/{{1}}/{{0}}.cshtml";
var layoutLocati
on = $"/Themes/{theme}/Views/Shared/{{0}}.cshtml";
return new[] { themeLocation, layoutLocation }.Concat(viewLocations);
}
return viewLocations;
}
}
注册视图位置扩展器
实现完成后,需要将其注册到 MVC 的配置中。可以在 Program.cs 或 Startup.cs 中进行注册:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews(options =>
{
options.ViewLocationExpanders.Add(new ThemeViewLocationExpander());
});
或者使用工厂模式注册,以便支持依赖注入:
AdMaker AI
从0到爆款高转化AI广告生成器
65
查看详情
builder.Services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new ThemeViewLocationExpander());
});
实际效果示例
假设请求地址为:/Home/Index?theme=dark,则 MVC 会优先查找以下路径:
/Themes/dark/Views/Home/Index.cshtml/Themes/dark/Views/Shared/_Layout.cshtml- 再回退到默认路径如
/Views/Home/Index.cshtml
这样就可以实现无需复制代码即可切换界面主题。
基本上就这些。只要理解 PopulateValues 用于决定缓存键,ExpandViewLocations 用于提供额外路径,就能灵活控制视图加载逻辑。常见用途包括多站点共享视图、A/B 测试、插件式架构等场景。
以上就是ASP.NET Core 中的视图位置扩展器如何自定义?的详细内容,更多请关注其它相关文章!
# 是一个
# 比较好网站seo怎么选
# 廊坊营销推广费用
# 软装关键词排名
# 漫画网站怎么引流推广
# 营销推广活动哪个免费
# 德州定制网站建设地址
# seo收录多网站
# 江油网站推广方案
# 如何评价seo价值
# 免费提供北京网站建设
# 你可以
# 加载
# html
# 操作步骤
# 键值
# 合集
# 上标
# 自定义
# 下划线
# red
# .net
# 键值对
# 多语言
# 路由
# app
相关栏目:
【
企业资讯168 】
【
行业动态50218 】
【
媒体报道120512 】
相关推荐:
折叠屏手机信号哪个最强
固态硬盘如何判断大小
typescript在浏览器里怎么用
typescript怎么理解的
单片机.lib文件怎么打开
春运抢票极速版怎么抢票
楔子是什么意思
单身聊天app有哪些软件 2025最靠谱的单身交友软件推荐
j*a怎么让数组倒换
固态硬盘如何迁移系统
5g手机怎么没视频通话功能
点焊机接触器上power是什么意思
typescript怎么使用map
debian10和ubuntu20哪个好用
如何进入安卓命令行
没基础做单片机怎么样
a03怎么根据编号找文链接入口
爱奇艺中下载的视频怎么在PPT中播放操作方法
如何显示固态硬盘
如何给电脑加装固态硬盘
type-c全能接口是什么意思
充电器上的power是什么意思
手机全功能type-c接口是什么意思
折叠屏手机为什么凉凉
typescript怎么添加css样式
笔记本电脑多少钱
命令不执行如何处理
折叠屏手机好不好,耐不耐用
联想手机如何输入命令行
ip dhcp是什么意思
如何学习typescript
显示器的power是什么意思
typescript是什么类型的语言
得物怎样不扣手续费 如何通过得物不支付手续费
如何安装m.2固态硬盘
分享一个稳定的ao3镜像网址
如何以命令符运行程序
市盈率底下 18A 19E 是什么意思
typescript属性只读如何修改
单片机怎么控制内功率
单片机加法程序怎么写
摄像机的power chg是什么意思中文
春运抢票如何快速抢到票
基金市盈率是什么意思
春运抢票技巧攻略
选哪个折叠屏手机好用
5g手机4g卡怎么没有网络
linux命令行如何使用中文输入法
单片机计时程序怎么写
命令行下如何导出数据库


on = $"/Themes/{theme}/Views/Shared/{{0}}.cshtml";
return new[] { themeLocation, layoutLocation }.Concat(viewLocations);
}
return viewLocations;
}
}
