2016-10-30 28 views
7

'da küçük harfli kesikli yollar otomatik olarak oluşturur. ASP.NET Core, varsayılan olarak http://localhost:5000/DashboardSettings/Index gibi CamelCase-Routes kullanır. Ancak, tire ile sınırlanan küçük harfleri kullanmak istiyorum: http://localhost:5000/dashboard-settings/index Daha yaygın ve tutarlı olduklarından, uygulamamın çizgi ile küçük harfli URL'leri olan WordPress'i çalıştıran bir web sitesine uzanmasına neden oluyor. ASP.NET Core

Ben yönlendirme-seçenekleri kullanarak küçük harfe URL'ler değiştirebileceğini öğrendik:

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

Bu işler ama bana kötü okunabilir http://localhost:5000/dashboardsettings/index gibi herhangi sınırlayıcı olmaksızın url'lere verdi. Ben

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

gibi rota özelliğini kullanarak özel yolları tanımlayabilir Ama bu ekstra işi neden olur ve hataya açık olduğunu. Büyük harfli karakterleri arayan, onlardan önce bir tire yerleştiren ve büyük harfli küçük harfli bir otomatik çözüm tercih ederim. Eski ASP.NET için bu büyük bir sorun değildi, ancak ASP.NET Çekirdeğinde bunun nasıl ele alınacağını görmüyorum.

Burada yapmanın yolu nedir? URL'leri üretebildiğim bir tür araca ihtiyacım var (etiket yardımcıları için olduğu gibi) ve dash-sınırlayıcılar tarafından CamelCase'in yerini al. Daha sonra yönlendirme için başka bir arabirim türüne ihtiyacım var, böylece çizgi sınırlayıcı URL'ler benim denetleyici/eylem isimleriyle doğru eşleşme için CamelCase'e geri dönüştürülür.

cevap

6

Partiye biraz geç ama .. Bunu IControllerModelConvention kullanarak yapabilirsiniz.

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(); 
     } 
} 

Sonra ancak atlamak için, seçiciler filtrelemek için daha iyi, daha fazla bilgi ve burada örnek bilgisi için https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

0

Teşekkür bulabilir Startup.cs

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

ortamında kayıt özel bir rota şablonu olanlarla:

5

Ben Asp.NetCore 2.0.0 ve Jilet Pages (gerekli hiçbir açık kontrolör) kullanıyorum yüzden tüm ihtiyaç duyulan şudur:

  1. Enable Küçük Harf Url'ler:

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

  2. bir oluştur dosya Dashboard-Settings.cshtml adında ve ortaya çıkan rota cevabı Ayrıca /dashboard-settings

+0

olur: https://stackoverflow.com/a/42050471/195755 – yzorg

İlgili konular