2016-10-30 53 views
7

Program ASP.NET Core domyślnie używa tras CamelCase, takich jak http://localhost:5000/DashboardSettings/Index. Ale chcę używać małych liter, które są ograniczane myślnikami: http://localhost:5000/dashboard-settings/index Są bardziej powszechne i spójne, ponieważ moja aplikacja rozszerza stronę internetową z Wordpress, która ma również małe adresy z myślnikami.Automatyczne generowanie małych przerywanych tras w środowisku ASP.NET Core

dowiedziałem się, że mogę zmienić adres URL na małe litery przy użyciu routingu-options:

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

To działa, ale dał mi adresy URL bez ogranicznika jak http://localhost:5000/dashboardsettings/index które są źle odczytać. Mogłabym zdefiniować trasy niestandardowe przy użyciu atrybutu trasy, np.

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

Ale to powoduje dodatkową pracę i jest podatne na błędy. Wolałbym automatyczne rozwiązanie, które wyszukuje wielkie litery, wstawia przed nimi kreskę i tworzy małe litery wielkimi literami. Dla starego ASP.NET nie był to duży problem, ale na Core ASP.NET nie widzę żadnego kierunku, jak sobie z tym poradzić.

Co w tym przypadku zrobić? Potrzebuję jakiegoś interfejsu, w którym będę mógł generować adresy URL (np. Dla pomocników tagów) i zastąpić CamelCase przez ograniczniki kreskowe. Następnie potrzebuję innego rodzaju interfejsu do routingu, aby adresy URL ogranicznika zostały ponownie zamienione na CamelCase w celu poprawnego dopasowania do moich kontrolerów/nazw akcji.

Odpowiedz

6

Trochę spóźniony na przyjęcie tutaj, ale .. Można to zrobić poprzez wdrożenie 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(); 
     } 
} 

Następnie zarejestrowanie go w Startup.cs

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

można znaleźć więcej informacji i przykładem https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

0

dzięki za informacje, jednak lepiej filtrować selektorów, aby pominąć te z niestandardowym szablonem trasy: na przykład [HttpGet("/[controller]/{id}")])

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

Używam Asp.NetCore 2.0.0 i wyjątkowo Pages (bez wyraźnej potrzeby) kontrolera, więc wszystko, co potrzebne jest:

  1. Włącz Lowercase adresami:

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

  2. Tworzenie plik o nazwie Dashboard-Settings.cshtml i otrzymaną droga staje /dashboard-settings

+0

również w odpowiedzi: https://stackoverflow.com/a/42050471/195755 – yzorg