ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
ASP.NET CORE MVC 中,默认的 Route 模板是: /{controller}/{action} 。我们可以通过开启 URL 小写转换将 URL 变为小写,但此方式在 Controller 或者 Action 为一个词组时,生成的 URL 并不友好。假设我们有 UserController 和 AddUser 方法,则框架生成的 URL 可能是: /User/AddUser ,在开启小写转换的情况下可能是下面的结果: /user/adduser 。包含大写字符的 URL 并没有问题,但是小写的 URL 更加常规,而完全转换小写造成的问题就是 URL 的可读性很差。本文将提供一些代码,帮助框架生成减号分隔样式的 URL ,当应用了这些代码以后,生成的 URL 类似这样: /user/add-user 。
微软为我们提供了 RouteAttribute ,可以对 Controller 或者 Action 进行标记,以达到自定义访问路径的目的。这种方式非常强大,但在项目较大的情况下使用起来有些繁杂。毕竟手工对每一个 Controller 和 Action 进行标记也有不小的工作量。
ASP.NET CORE MVC 框架中定义了一个 IControllerModelConvention 接口,我们可以实现该接口在运行时为 Action 附加一个 Route 模型。在项目中新建 DashedRoutingConvention 类文件,代码如下:
public class DashedRoutingConvention : IControllerModelConvention
{
public void Apply(ControllerModel controller)
{
var hasRouteAttributes = controller.Selectors.Any(selector =>
selector.AttributeRouteModel != null);
if (hasRouteAttributes)
{
// This controller manually defined some routes, so treat this
// as an override and not apply the convention here.
return;
}
foreach (var controllerAction in controller.Actions)
{
foreach (var selector in controllerAction.Selectors.Where(x => x.AttributeRouteModel == null))
{
var parts = new List<string>();
foreach (var attr in controller.Attributes)
{
if (attr is AreaAttribute area)
{
parts.Add(area.RouteValue);
}
}
if (
parts.Count == 0
&& controller.ControllerName == "Home"
&& controllerAction.ActionName == "Index"
)
{
continue;
}
parts.Add(PascalToKebabCase(controller.ControllerName));
if (controllerAction.ActionName != "Index")
{
parts.Add(PascalToKebabCase(controllerAction.ActionName));
}
selector.AttributeRouteModel = new AttributeRouteModel
{
Template = string.Join("/", parts)
};
}
}
}
private static string PascalToKebabCase(string value)
{
if (string.IsNullOrEmpty(value))
{
return value;
}
return Regex.Replace(
value,
"(?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z])",
"-$1",
RegexOptions.Compiled)
.Trim()
.ToLower();
}
}
之后,将 DashedRoutingConvention 在 Startup.cs 中注册。
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc(options => options.Conventions.Add(new DashedRoutingConvention()));
}
至此,全部代码完毕。
Notices:
本代码支持 Area ,并会对 Area 名称也进行转义。
本代码使用自定义路由的方式实现功能,所以可能对预定义路由有影响。
更多与路由相关的信息可参见:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing
本代码参考了其他代码,详见:https://stackoverflow.com/questions/40334515/automatically-generate-lowercase-dashed-routes-in-asp-net-core
码农很忙授权中心已经启用了本代码,演示:https://passport.coderbusy.com/
原文:https://www.coderbusy.com/archives/956.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL相关推荐
- ASP.NET Core MVC 视图
ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处,学习难度较低.以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点. 布局用于提供各个页面所需的公共部分 ...
- 关于MVC与三层架构、个人总结网上杂七杂八得出的最终成果、asp.net (core) MVC、JavaWeb的MVC
阅读本文必须明白的事情 首先需要明白的是不同语言实现的MVC与三层架构对应的层是不一样的!!! 拿.net来说,.net实现MVC与其他语言的MVC具体实现是不同的,asp.net MVC与 MVC ...
- ASP .NET Core MVC Entity Framework 旧书交易网站
代码在GitHub仓库:zhang0peter/Old-Book-Shop-System: Old Book Shop System ASP .Net Core MVC MySQL e-commerc ...
- ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】
索引: 目录索引 Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Ch ...
- asp.net core mvc上传大文件解决方案
asp.net core mvc上传大文件解决方案 参考文章: (1)asp.net core mvc上传大文件解决方案 (2)https://www.cnblogs.com/eggtwo/p/988 ...
- ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用
原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 ...
- ASP.NET Core MVC – Caching Tag Helpers
ASP.NET Core Tag Helpers系列目录,这是第二篇,共五篇: ASP.NET Core MVC – Tag Helpers 介绍 ASP.NET Core MVC – Caching ...
- asp.net core mvc权限控制:在视图中控制操作权限
在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...
最新文章
- 京东热点key探测系统发布,单机 QPS 提升至 37 万
- 应用程序利用ADO对象访问数据库
- jpg无损压缩 java_使用FreeImage对JPEG进行无损优化
- away3d 4.0.9Gold 学习笔记 加载方法总结(4)
- java 排序 内存_Java内存模型(二)——重排序
- java多线程 信号量(Semaphore),死锁
- sql语句日期格式转换
- python读取手机通讯录_利用python解析手机通讯录
- gdata_YouTube GData API和Android
- 家用汽车维修5:换正时带和水泵
- 手机排行榜,手机党必看!
- 移动端 背景音乐 自动播放
- 回眸 2022,展望 2023
- Python项目:赛车
- Python 常用的标准库以及第三方库有哪些?
- KT6368A蓝牙芯片调试中遇到的常见问题,以及解决的方法
- Alpine Linux(初)
- C语言实现SM4加解密算法
- NSPredicate模糊、精确、查询
- 【爬虫】分类爬取小米商店的apk
热门文章
- 军哥华为HCNP(科目H12-221)真题解析课程:1-30题
- Angular变化检测机制
- POJ 2135 最小费用最大流
- 全选按钮的使用。winfrom程序中,对全选按钮的理解,欢迎拍砖!
- 基于开源流程引擎Activiti5的工作流开发平台BPMX3
- 使用C#为.NET Interactive开发自定义扩展
- 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术
- 如何在 .NET 中使用 Kafka
- .NET 6 Preview 1 开箱,带你体验新版本
- 5种设置ASP.NET Core应用程序URL的方法