คุณบังคับใช้การกำหนดเส้นทางตัวพิมพ์เล็กใน ASP.NET Core ได้อย่างไร?


94

ใน ASP.NET 4 สิ่งนี้ทำได้ง่ายเหมือนกับroutes.LowercaseUrls = true;ในRegisterRoutesตัวจัดการสำหรับแอป

ฉันไม่พบสิ่งที่เทียบเท่าใน ASP.NET Core เพื่อให้บรรลุสิ่งนี้ ฉันคิดว่ามันจะอยู่ที่นี่:

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

แต่ไม่มีอะไรที่configureRoutesจะอนุญาต ... เว้นแต่จะมีวิธีการขยายบางที่ที่ฉันไม่พบในเอกสาร

คำตอบ:


202

สำหรับ ASP.NET Core:

เพิ่มบรรทัดต่อไปนี้ในConfigureServicesเมธอดของStartupคลาส

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

ขอบคุณ Skorunka สำหรับคำตอบเป็นความคิดเห็น ฉันคิดว่ามันคุ้มค่าที่จะส่งเสริมคำตอบที่แท้จริง


35
เป็นที่น่าสังเกตว่าคุณควรใส่สิ่งนี้ก่อนที่คุณจะเรียกใช้วิธีการAddMvc()ของคุณ ซึ่งเรียกโดยใช้ตัวแปรของวิธีการในการเพิ่มการอ้างอิงในคอลเล็กชันบริการของคุณ ดังนั้นเมื่อเห็นว่ามีการเพิ่มการอ้างอิงการกำหนดเส้นทางแล้วก็จะข้ามส่วนของตรรกะการตั้งค่านั้นไป Startup.ConfigureServices()AddRouting()AddMvc()TryAddMvc()
Nick Albrecht

การเปลี่ยนสิ่งนี้เป็นคำตอบที่ถูกต้องเนื่องจากของฉันอยู่ในช่วงเปลี่ยน asp 4 เป็น core
mariocatch

@NickAlbrecht ดูเหมือนจะไม่สร้างความแตกต่างหากถูกเรียกก่อนหรือหลัง (อย่างน้อย ASP.NET Core 5.0) AddRouting () จะถูกเรียกสองครั้งดังนั้นจึงไม่สำคัญว่าจะอยู่ในลำดับใด
Thomas Levesque

ฉันเชื่อว่ามันทำได้รอบ. NET Core 3.x. พวกเขาเปลี่ยนเพื่อให้การกำหนดเส้นทางเป็นคุณลักษณะแบบสแตนด์อะโลนแทนที่จะรวมกับ MVC ฉันไม่เชื่อว่าการกำหนดเส้นทางถูกเรียกจากAddMvc(หรือAddControllersWithViewsถ้าคุณไม่ต้องการ RazorPages) อีกต่อไป ดังนั้นคำสั่งจึงมีความสำคัญมากหากคุณใช้ AspNetCore 2 (อย่าจำได้ว่านี่เป็นตัวเลือกใน 1.x) แต่พวกเขาไม่ได้แยกพฤติกรรมพิมพ์เล็กเป็นสองการตั้งค่าดังนั้นหากคุณต้องการที่อยู่กรณีที่ต่ำกว่าอย่างเต็มที่คุณจะต้องตั้งทั้งสองLowercaseUrlsและการLowercaseQueryStrings true
Nick Albrecht

37

อัปเดตใน ASP.NET Core Version> = 2.2

จากASP.NET Core 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 Pages:

ใน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

ฉันใช้วิธีการกำหนดเส้นทางมาตรฐาน (ไม่ใช่การกำหนดเส้นทางแอตทริบิวต์) กับโซลูชัน core v2.2 ใหม่ล่าสุดใน Visual Studio มีภาพหน้าจอสองภาพ (รหัส c # และรหัส. cshtml) ฉันพยายามสร้างลิงก์ในรูปแบบต่างๆโดยไม่มีผลใด ๆ imgur.com/a/L8dCF6c
user3172616

21

ตามที่คำตอบอื่น ๆ ระบุการเพิ่ม:

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


กำหนดค่า <RouteOptions> () เป็นคำตอบที่ดีที่สุด imho: เล็กและตรงประเด็น (ทดสอบบน mvc core 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

Microsoft.Extensions.DependencyInjection ใน Microsoft.AspNetCore.Routing.dll
Skorunka František

3
นี่เป็นจริงก่อน RTM ตอนนี้คุณควรใช้. AddRouting แทน. ConfigureRouting
Yves Schelpe

0

สำหรับข้อมูลประจำตัวคำตอบของ@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";
    ...
});

Ref: กำหนดค่า ASP.NET Core Identity


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.