1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    ASP.NET Core自動生成小寫破折號路由的實現方法_實用技巧

    來源:腳本之家  責任編輯:小易  

    默認情況下,ASP.NET Core使用如 http://localhost:5000/HomeIndex 類的大駝峰路由。但是如果想使用小寫的路由,并且這些路由用破折號分隔:http://localhost:5000/home-index它們比較常見且一致。

    舉例.NET常見路由
    http://localhost:5000/User/ListPages
    想要的效果
    http://localhost:5000/user/list-pages

    1、如何生成小寫的路由可以這樣設置

    services.ConfigureRouting(setupAction => {
        setupAction.LowercaseUrls = true;
    });

    2、生成帶破折號并且小寫的路由可以這樣設置

    [Route("dashboard-settings")]
    class DashboardSettings:Controller {
        public IActionResult Index() {
            // ...
        }
    }

    似乎上面使用特性路由可以解決這個問題。但是我不想使用,因為每個action都要手動去設置,太繁瑣也很容易出錯。

    我想要的效果是在程序中寫個擴展類做到可配置處理。

    3、解決方案

    以下支持Asp.Net Core Version>=2.2

    要做到這一點,首先創建SlugifyParameterTransformer類應該如下所示

    public class SlugifyParameterTransformer : IOutboundParameterTransformer
    {
        public string TransformOutbound(object value)
        {
            // Slugify value
            return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
        }
    }

    3.1 對于Asp.Net Core2.2 MVC:

    在StartUp中ConfiregeServices這樣配置

    services.AddRouting(option =>
    {
        option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
    });

    路由如下配置:

    app.UseMvc(routes =>
    {
        routes.MapRoute(
           name: "default",
           template: "{controller:slugify}/{action:slugify}/{id?}",
           defaults: new { controller = "Home", action = "Index" });
     });

    3.2  對于Asp.Net Core2.2 Web API:

    在StartUp中ConfiregeServices這樣配置

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(options => 
        {
            options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    3.3 對于Asp.Net Core>=3.0 MVC:

    在StartUp中ConfiregeServices這樣配置

    services.AddRouting(option =>
    {
        option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
    });

    路由如下配置:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapAreaControllerRoute(
            name: "AdminAreaRoute",
            areaName: "Admin",
            pattern: "admin/{controller:slugify=Dashboard}/{action:slugify=Index}/{id:slugify?}");
    
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller:slugify}/{action:slugify}/{id:slugify?}",
            defaults: new { controller = "Home", action = "Index" });
    });

    3.4 對于Asp.Net Core>=3.0 Web API:

    在StartUp中ConfiregeServices這樣配置

    services.AddControllers(options => 
    {
        options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
    });

    3.5 對于Asp.Net Core>=3.0 Razor Pages:

    在StartUp中ConfiregeServices這樣配置

    services.AddRazorPages(options => 
    {
        options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer()));
    });

    這樣會使/Sys/UserList路由變為/sys/user-list

    3.6 對于上面MVC項目,路由模板要調整很多,其實還可以通過實現IControllerModelConvention來實現。

    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 template = new StringBuilder();
    
                        if (controllerAction.Controller.ControllerName != "Home")
                        {
                            template.Append(PascalToKebabCase(controller.ControllerName));
                        }
    
                        if (controllerAction.ActionName != "Index")
                        {
                            template.Append("/" + PascalToKebabCase(controllerAction.ActionName));
                        }
    
                        selector.AttributeRouteModel = new AttributeRouteModel()
                        {
                            Template = template.ToString()
                        };
                    }
                }
            }
    
            public 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();
            }
    }

    在StartUp中ConfiregeServices這樣配置

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc(options => options.Conventions.Add(new DashedRoutingConvention()));
    }

    譯文:https://stackoverflow.com/questions/40334515/automatically-generate-lowercase-dashed-routes-in-asp-net-core

    譯者:realyrare

    出處:https://www.cnblogs.com/mhg215/

    以上就是ASP.NET Core自動生成小寫破折號路由的實現方法的詳細內容,更多關于ASP.NET Core生成小寫破折號路由的資料請關注真格學網其它相關文章!

    您可能感興趣的文章:ASP.NET Core3.1 Ocelot路由的實現詳解ASP.NET Core端點路由的作用原理ASP.NET Core3.X 終端中間件轉換為端點路由運行詳解ASP.NET Core MVC學習教程之路由(Routing)asp.net Core3.0區域與路由配置的方法ASP.NET Core 2.2中的Endpoint路由詳解ASP.NET Core中自定義路由約束的實現asp.net core webapi項目配置全局路由的方法示例詳解ASP.NET Core 2.0 路由引擎之網址生成(譯)

  3. 本文相關:
  4. .net core 2.0遷移小技巧之web.config 配置文件示例詳解
  5. asp.net生成字母和數字混合圖形驗證碼
  6. asp.net 數據類型轉換類代碼
  7. c# quoted-printable編碼、解碼
  8. 利用asp.net mvc+easyui+sqlserver搭建企業開發框架
  9. asp.net顯示自己的網頁圖標的幾種方式
  10. gridview控件如何顯示序號
  11. mvc4制作網站教程第二章 用戶修改資料2.4
  12. asp.net提取多層嵌套json數據的方法
  13. checkbox控件默認選中,提交時永遠獲得選中狀態的實現代碼
  14. .NETCORE MVC RedirectToRoute跳轉其他頁面無效求解到
  15. 如何安裝aspnetcoremodule
  16. Asp.netCore怎么啟停本地服務
  17. c#一個解決方案里包含.netcore3.1和asp.net兩個項...
  18. microsoft.aspnetcore.authorization 干什么用
  19. asp.net core mvc 是不是未包含使用UA 動態選擇dis...
  20. microsoft.aspnetcore.http 在哪個dll中
  21. vscode 開發.net core 1.0 怎么玩
  22. 高分跪求~常用DOSS命令
  23. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全基礎應用實用技巧自學過程首頁asp.netasp.net core3.1 ocelot路由的實現詳解asp.net core端點路由的作用原理asp.net core3.x 終端中間件轉換為端點路由運行詳解asp.net core mvc學習教程之路由(routing)asp.net core3.0區域與路由配置的方法asp.net core 2.2中的endpoint路由詳解asp.net core中自定義路由約束的實現asp.net core webapi項目配置全局路由的方法示例詳解asp.net core 2.0 路由引擎之網址生成(譯).net core 2.0遷移小技巧之web.config 配置文件示例詳解asp.net生成字母和數字混合圖形驗證碼asp.net 數據類型轉換類代碼c# quoted-printable編碼、解碼利用asp.net mvc+easyui+sqlserver搭建企業開發框架asp.net顯示自己的網頁圖標的幾種方式gridview控件如何顯示序號mvc4制作網站教程第二章 用戶修改資料2.4asp.net提取多層嵌套json數據的方法checkbox控件默認選中,提交時永遠獲得選中狀態的實現代碼未將對象引用設置到對象的實例 (java正則表達式 pattern和matcheasp.net(c#)網頁跳轉七種方法小結未能加載文件或程序集“xxx”或它asp.net“服務器應用程序不可用”asp.net中的幾種彈出框提示基本實asp.net gridview 72般絕技asp.net生成excel并導出下載五種asp.net對路徑"xxxxx"asp.net漢字轉拼音和獲取漢字首字由于擴展配置問題而無法提供您請求的頁面asp.net core利用accesscontrolhelper實現.net數組使用中的注意事項小結asp.net中viewstate的用法詳解community server專題一:概述community asp.net后臺注冊js的四種方法分享asp.net core2讀寫influxdb時序數據庫的方asp.net(c#) 動態添加非asp的標準html控件asp.net mvc實現多個按鈕提交的方法c#時間格式化(datetime)用法詳解
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载