Asp.net Core MVC 动态路由

动态路由 asp.net core 3.0 就支持了

csharp 复制代码
 // 映射关系
 public class TranslationDatabase
 {
     private static Dictionary<string, Dictionary<string, string>> Translations
      = new Dictionary<string, Dictionary<string, string>>
  {
     {
         "en", new Dictionary<string, string>
         {
             { "orders", "orders" },
             { "list", "list" }
         }
     },
     {
         "de", new Dictionary<string, string>
         {
             { "bestellungen", "orders" },
             { "liste", "list" }
         }
     },
     {
         "pl", new Dictionary<string, string>
         {
             { "zamowienia", "order" },
             { "lista", "list" }
         }
     },
  };

     public async Task<string> Resolve(string lang, string value)
     {
         var normalizedLang = lang.ToLowerInvariant();
         var normalizedValue = value.ToLowerInvariant();
         if (Translations.ContainsKey(normalizedLang)
             && Translations[normalizedLang]
                 .ContainsKey(normalizedValue))
         {
             return Translations[normalizedLang][normalizedValue];
         }

         return null;
     }
 }
 
 //动态路由
 public class TranslationTransformer : DynamicRouteValueTransformer
 {
     private readonly TranslationDatabase _translationDatabase;

     public TranslationTransformer(TranslationDatabase translationDatabase)
     {
         _translationDatabase = translationDatabase;
     }

     public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext
     , RouteValueDictionary values)
     {
         if (!values.ContainsKey("language")
             || !values.ContainsKey("controller")
             || !values.ContainsKey("action")) return values;

         var language = (string)values["language"];
         var controller = await _translationDatabase.Resolve(language,
             (string)values["controller"]);

         if (controller == null) return values;
         values["controller"] = controller;

         var action = await _translationDatabase.Resolve(language,
             (string)values["action"]);

         if (action == null) return values;
         values["action"] = action;

         return values;
     }
 }

参考资料

相关推荐
回家路上绕了弯几秒前
CAP 与 BASE:分布式系统的核心思想与实践指南
分布式·后端
CappuccinoRose3 分钟前
Docker配置过程完整梳理
后端·python·docker·容器·环境配置
MUTA️7 分钟前
使用flask将服务器端的视频通过网页在本地查看
后端·python·flask
Lisonseekpan8 分钟前
技术选型分析:MySQL、Redis、MongoDB、ElasticSearch与大数据怎么选?
大数据·redis·后端·mysql·mongodb·elasticsearch
Dwzun12 分钟前
基于Java+SpringBoot+Vue的美甲店管理系统【附源码+文档+部署视频+讲解)
vue.js·spring boot·后端·毕业设计·计算机毕业设计
Qiuner12 分钟前
Spring 机制六: MVC 全链路源码解析:从 DispatcherServlet 到返回值解析(超硬核源码深度)
java·spring boot·后端·spring·mvc
Victor35618 分钟前
Netty(5)Netty的ByteBuf是什么?它与Java NIO的ByteBuffer有何不同?
后端
Victor35619 分钟前
Netty(6)什么是Netty的Handler和Codec?
后端
追逐时光者9 小时前
一款开源、现代化的 WinForm UI 控件库
后端·.net
花月C10 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法