如何在ASP.NET Core路由规则中添加前导零?

3
一个ASP.NET Core 2.1 MVC应用有以下规则:
routes.MapRoute(
    name: "blog_list_year_month",
    defaults: new { 
        controller = "Blog", 
        action = "Index", 
        year = (int?)null, 
        month = (int?)null
    },
    template: "blog/{year?}/{month?}");

对于2018年1月,该规则生成一个URL,如blog/2018/1

如何表达月份始终应为两位数字?即引擎将生成一个URL blog/2018/01


(点赞好问题)但是...这有什么关系吗? - Erik Philips
1
  1. 个人喜好/口味。
  2. URL故意受到WordPress的启发(WP使用两个数字)。
  3. 通常情况下,如果用作标识符,我更喜欢月份以两位数字的形式表示。
  4. 这样更有助于排序。
- alik
这些答案对于未来的读者非常有帮助 :D - Erik Philips
如果这是一个匿名类型,你可以将 yearmonth 变成字符串,并按照你的喜好进行格式化吗? - Theodoros Chatzigiannakis
匿名类型指的是什么?相关控制器方法为public async Task<ViewResult> Index(int? year = null, int? month = null, int? pageNumber = null)。除非真正必要,否则我不喜欢在这个方法体内进行类型检查和类型转换。 - alik
显示剩余2条评论
1个回答

0
你有考虑过使用正则表达式来匹配两位数月份并将其设置为路由的限制吗?
例如:
new {month = @"(0[1-9]|1[0-2])"}

这将限制您的参数为两位数字。


是的,这看起来像是做这件事的方法。我查看了https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.1,其中有路由模板的详细示例,唯一接近的只有正则表达式。 - Robert Harvey
如果我加上这个限制条件,当生成链接时搜索正确的路由时,该路由将被跳过,因为生成的URL将把这些值作为查询参数/Blog/BlogPost/?year=2018&month=1(在另一个规则中尝试过)。 - alik
@alik 我认为你有两个选择,要么a)改变url格式的方式,用零填充它们或b)在正则表达式上添加一个or语句,以允许一个字符路由...但这就违背了路由约束最初的目的:( - Josh
我刚想到了另一个解决方法,目前我倾向于使用它。复制路由,一个用于1-9(在模板中有一个初始零),第二个用于10-12(没有零)。然而,我通常无法爱上这些hack的方式。我仍然天真地希望有一种优雅的解决方案 :) - alik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接