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:

  1. 本代码支持 Area ,并会对 Area 名称也进行转义。

  2. 本代码使用自定义路由的方式实现功能,所以可能对预定义路由有影响。

  3. 更多与路由相关的信息可参见:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

  4. 本代码参考了其他代码,详见:https://stackoverflow.com/questions/40334515/automatically-generate-lowercase-dashed-routes-in-asp-net-core

  5. 码农很忙授权中心已经启用了本代码,演示:https://passport.coderbusy.com/

原文:https://www.coderbusy.com/archives/956.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL相关推荐

  1. ASP.NET Core MVC 视图

    ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处,学习难度较低.以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点. 布局用于提供各个页面所需的公共部分 ...

  2. 关于MVC与三层架构、个人总结网上杂七杂八得出的最终成果、asp.net (core) MVC、JavaWeb的MVC

    阅读本文必须明白的事情 首先需要明白的是不同语言实现的MVC与三层架构对应的层是不一样的!!! 拿.net来说,.net实现MVC与其他语言的MVC具体实现是不同的,asp.net MVC与 MVC ...

  3. ASP .NET Core MVC Entity Framework 旧书交易网站

    代码在GitHub仓库:zhang0peter/Old-Book-Shop-System: Old Book Shop System ASP .Net Core MVC MySQL e-commerc ...

  4. ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  5. 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 ...

  6. asp.net core mvc上传大文件解决方案

    asp.net core mvc上传大文件解决方案 参考文章: (1)asp.net core mvc上传大文件解决方案 (2)https://www.cnblogs.com/eggtwo/p/988 ...

  7. ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用

    原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 ...

  8. ASP.NET Core MVC – Caching Tag Helpers

    ASP.NET Core Tag Helpers系列目录,这是第二篇,共五篇: ASP.NET Core MVC – Tag Helpers 介绍 ASP.NET Core MVC – Caching ...

  9. asp.net core mvc权限控制:在视图中控制操作权限

    在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...

最新文章

  1. 京东热点key探测系统发布,单机 QPS 提升至 37 万
  2. 应用程序利用ADO对象访问数据库
  3. jpg无损压缩 java_使用FreeImage对JPEG进行无损优化
  4. away3d 4.0.9Gold 学习笔记 加载方法总结(4)
  5. java 排序 内存_Java内存模型(二)——重排序
  6. java多线程 信号量(Semaphore),死锁
  7. sql语句日期格式转换
  8. python读取手机通讯录_利用python解析手机通讯录
  9. gdata_YouTube GData API和Android
  10. 家用汽车维修5:换正时带和水泵
  11. 手机排行榜,手机党必看!
  12. 移动端 背景音乐 自动播放
  13. 回眸 2022,展望 2023
  14. Python项目:赛车
  15. Python 常用的标准库以及第三方库有哪些?
  16. KT6368A蓝牙芯片调试中遇到的常见问题,以及解决的方法
  17. Alpine Linux(初)
  18. C语言实现SM4加解密算法
  19. NSPredicate模糊、精确、查询
  20. 【爬虫】分类爬取小米商店的apk

热门文章

  1. 军哥华为HCNP(科目H12-221)真题解析课程:1-30题
  2. Angular变化检测机制
  3. POJ 2135 最小费用最大流
  4. 全选按钮的使用。winfrom程序中,对全选按钮的理解,欢迎拍砖!
  5. 基于开源流程引擎Activiti5的工作流开发平台BPMX3
  6. 使用C#为.NET Interactive开发自定义扩展
  7. 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术
  8. 如何在 .NET 中使用 Kafka
  9. .NET 6 Preview 1 开箱,带你体验新版本
  10. 5种设置ASP.NET Core应用程序URL的方法