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.Routing및 Microsoft.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.