2016-10-30 14 views
7

ASP.NET Core sử dụng CamelCase-Routes như http://localhost:5000/DashboardSettings/Index theo mặc định. Nhưng tôi muốn sử dụng các tuyến đường thường, được phân tách bằng dấu gạch ngang: http://localhost:5000/dashboard-settings/index Chúng phổ biến và nhất quán hơn, khiến ứng dụng của tôi mở rộng trang web chạy Wordpress, cũng có url chữ thường với dấu gạch ngang.Tự động tạo các đường nét chữ thường trong ASP.NET Core

Tôi đã học được rằng tôi có thể thay đổi các url thành chữ thường sử dụng định tuyến lựa chọn:

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

này hoạt động nhưng đã cho tôi url mà không cần bất kỳ dấu phân cách như http://localhost:5000/dashboardsettings/index mà là nặng có thể đọc được. Tôi có thể xác định các tuyến đường tùy chỉnh bằng cách sử dụng thuộc tính tuyến đường như

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

Nhưng điều đó gây ra thêm công việc và dễ xảy ra lỗi. Tôi thích một giải pháp tự động tìm kiếm các ký tự chữ hoa, chèn dấu gạch ngang trước chúng và tạo chữ thường viết hoa. Đối với ASP.NET cũ này không phải là một vấn đề lớn, nhưng trên ASP.NET Core tôi thấy không có hướng làm thế nào để xử lý này.

Làm cách nào để thực hiện việc này tại đây? Tôi cần một số loại giao diện, nơi tôi có thể tạo ra các url (như cho người trợ giúp thẻ) và thay thế CamelCase bằng dấu gạch ngang-dấu phân cách. Sau đó, tôi cần một loại giao diện khác để định tuyến, do đó các url phân tách dấu gạch ngang được chuyển đổi thành CamelCase để khớp chính xác với các tên điều khiển/hành động của tôi.

Trả lời

6

Một chút muộn cho bữa tiệc ở đây nhưng .. Có thể thực hiện việc này bằng cách triển khai 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(); 
     } 
} 

Sau đó đăng ký nó trong Startup.cs

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

có thể tìm thêm thông tin và ví dụ ở đây https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

0

Cảm ơn thông tin, tuy nhiên nó tốt hơn để lọc các selectors, để bỏ qua những người có mẫu tuyến đường tùy chỉnh: [HttpGet("/[controller]/{id}")] chẳng hạn)

foreach (var selector in controllerAction.Selectors 
             .Where(x => x.AttributeRouteModel == null)) 
5

Tôi đang sử dụng Asp.NetCore 2.0.0 và Razor Trang (không điều khiển rõ ràng cần thiết), do đó tất cả những gì cần thiết là:

  1. Enable Chữ thường url:

    services.AddRouting(options => options.LowercaseUrls = true);

  2. Tạo tệp có tên Dashboard-Settings.cshtml và tuyến đường kết quả trở thành /dashboard-settings

+0

Ngoài ra câu trả lời: https://stackoverflow.com/a/42050471/195755 – yzorg

Các vấn đề liên quan