ASP.NET Core에서 소문자 라우팅을 어떻게 적용하나요?


90

ASP.NET 4에서는 앱 routes.LowercaseUrls = true;RegisterRoutes처리기 에서처럼 쉬웠습니다 .

이를 달성하기 위해 ASP.NET Core에서 동등한 것을 찾을 수 없습니다. 나는 그것이 여기있을 것이라고 생각한다 :

app.UseMvc(configureRoutes =>
{
    configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});

하지만 configureRoutes문서에서 찾을 수없는 어딘가에 확장 메서드가 없으면 허용 할 수있는 것은 없습니다.

답변:


192

ASP.NET Core의 경우 :

클래스 의 ConfigureServices메서드에 다음 줄을 추가합니다 Startup.

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

의견으로 답변 해 주신 Skorunka에게 감사드립니다. 실제 답변으로 홍보 할 가치가 있다고 생각했습니다.


35
당신이 실제로 호출하기 전에이를 넣어야 주목할 그것은의 가치가 AddMvc()당신의 Startup.ConfigureServices()방법. AddRouting()에서 호출되는 메서드는 서비스 컬렉션에 종속성을 추가하기위한 변형 된 메서드를 AddMvc()사용합니다 Try. 따라서 라우팅 종속성이 이미 추가 된 것을 확인하면 AddMvc()설정 논리의 해당 부분을 건너 뜁니다 .
Nick Albrecht

내 것이 asp 4를 core로 전환하는 동안 이었기 때문에 이것을 정답으로 전환했습니다.
mariocatch

31

ASP.NET Core 버전> = 2.2의 업데이트

에서 ASP.NET 코어 2.2 과 함께 소문자 당신은 또한 할 수 경로를 점선 사용하여 ConstraintMap경로를 만들 것이다 /Employee/EmployeeDetails/1/employee/employee-details/1대신 /employee/employeedetails/1.

이렇게하려면 먼저 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();
    }
}

ASP.NET Core 2.2 MVC의 경우 :

에서 ConfigureServices의 방법 Startup클래스 :

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

ASP.NET Core 2.2 Web API의 경우 :

에서 ConfigureServices의 방법 Startup클래스 :

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

ASP.NET Core> = 3.0 MVC의 경우 :

에서 ConfigureServices의 방법 Startup클래스 :

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

ASP.NET Core> = 3.0 Web API의 경우 :

에서 ConfigureServices의 방법 Startup클래스 :

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

ASP.NET Core> = 3.0 Razor 페이지의 경우 :

에서 ConfigureServices의 방법 Startup클래스 :

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

이것은 /Employee/EmployeeDetails/1경로를 만들 것입니다/employee/employee-details/1


이 코드와 공식 Microsoft 코드도 시도했지만 "slugify"매개 변수 변환기는 효과가 없습니다. 라우팅 시스템에서 무시됩니다 (따라서 URL이 대시로 대체되지 않음). 자신을 확인하기 위해 로거를 TransformOutbound () 메서드에 넣었지만 거기에서 호출하지 않았습니다.
user3172616

괜찮아! 확인 해주세요!
TanvirArjel

@ user3172616 지금 확인했습니다! 예상대로 작동합니다! 경로를 employee-details. 구성을 보여 주시겠습니까?
TanvirArjel

@ user3172616 테스트 한 경로에서 특성 라우팅을 사용하고 있습니까?
TanvirArjel

Visual Studio의 새로운 핵심 v2.2 솔루션에서 표준 라우팅 접근 방식 (특성 라우팅 아님)을 사용합니다. 두 개의 스크린 샷 (c # 코드 및 .cshtml 코드)이 있습니다. 효과없이 다른 방법으로 링크를 생성하려고했습니다. imgur.com/a/L8dCF6c
user3172616

20

다른 답변에서 알 수 있듯이 다음을 추가하십시오.

services.Configure<RouteOptions>(options => options.LowercaseUrls = true);

전에

services.AddMvc(...)

훌륭하게 작동하지만 Identity를 사용하는 경우 다음도 필요하다고 추가하고 싶습니다.

services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    var appCookie = options.Cookies.ApplicationCookie;
    appCookie.LoginPath = appCookie.LoginPath.ToString().ToLowerInvariant();
    appCookie.LogoutPath = appCookie.LogoutPath.ToString().ToLowerInvariant();
    appCookie.ReturnUrlParameter = appCookie.ReturnUrlParameter.ToString().ToLowerInvariant();
});

그리고 필요한 경우 IdentityUser, 및 둘 다 IdentityRole자신의 클래스로 대체 하십시오.

방금 .NET Core SDK 1.0.4 및 1.0.5 런타임으로 테스트했습니다.


Configure <RouteOptions> ()가 가장 좋은 대답입니다. imho : 작고 곧바로 (mvc 코어 3.1에서 테스트 됨)
T-moty

12

해결책을 찾았습니다.

어셈블리 : Microsoft.AspNet.RoutingMicrosoft.Extensions.DependencyInjection네임 스페이스에서 ConfigureServices(IServiceCollection services)메서드 에서이 작업을 수행 할 수 있습니다 .

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

15
ASP NET MVC CORE의 경우 : services.AddRouting (options => {options.LowercaseUrls = true;});
Skorunka František 2016 년

Microsoft.AspNetCore.Routing.dll에서 Microsoft.Extensions.DependencyInjection
Skorunka 프란

3
RTM은, 이제 .ConfigureRouting 대신에 .AddRouting을 사용해야하기 전에이 사실이었다
이브 Schelpe

1

ID의 경우 @Jorge Yanes Diez 답변이 작동하지 않습니다 ASP.NET Core 2.2( 2.x라고 생각합니다 ). 따라서 Identity 및 ASP.NET Core 2.2 (2.x)를 사용하는 경우 여기에 해결책이 있습니다.

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/account/login";
    options.ReturnUrlParameter = "returnurl";
    ...
});

참조 : ASP.NET Core ID 구성


0

RegisterRoutes :: RouteConfig에 다음이 있습니다.

route.LowercaseUrls = true;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.