Làm thế nào để bạn thực thi định tuyến chữ thường trong ASP.NET Core?


90

Trong ASP.NET 4, điều này dễ dàng như routes.LowercaseUrls = true;trong RegisterRoutestrình xử lý cho ứng dụng.

Tôi không thể tìm thấy phần mềm tương đương trong ASP.NET Core để đạt được điều này. Tôi nghĩ nó sẽ ở đây:

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

Nhưng không có gì có configureRoutesthể cho phép nó ... trừ khi có một phương thức mở rộng ở đâu đó mà tôi không thể tìm thấy trong tài liệu?

Câu trả lời:


192

Đối với ASP.NET Core:

Thêm dòng sau vào ConfigureServicesphương thức của Startuplớp.

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

Cảm ơn Skorunka cho câu trả lời dưới dạng nhận xét. Tôi nghĩ nó có giá trị quảng bá thành một câu trả lời thực tế.


35
Cần lưu ý rằng bạn nên đặt điều này TRƯỚC KHI bạn thực sự gọi AddMvc()vào Startup.ConfigureServices()phương thức của mình . AddRouting()mà còn được gọi bằng cách AddMvc()sử dụng các Trybiến thể của phương pháp để thêm phần phụ thuộc vào bộ sưu tập dịch vụ của bạn. Vì vậy, khi nó thấy rằng các phần phụ thuộc định tuyến đã được thêm vào, nó sẽ bỏ qua các phần đó của AddMvc()logic thiết lập.
Nick Albrecht

Chuyển câu trả lời này thành câu trả lời đúng vì của tôi đang trong quá trình chuyển đổi asp 4 thành lõi.
mariocatch

32

Cập nhật trong ASP.NET Core Version> = 2.2

Từ ASP.NET Core 2.2 , cùng với chữ thường, bạn cũng có thể làm cho tuyến của mình bị đứt đoạn bằng cách sử dụng ConstraintMapnó sẽ làm cho tuyến của bạn /Employee/EmployeeDetails/1đến /employee/employee-details/1thay vì /employee/employeedetails/1.

Để làm như vậy, trước tiên hãy tạo SlugifyParameterTransformerlớp như sau:

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

Đối với ASP.NET Core 2.2 MVC:

Trong ConfigureServicesphương thức của Startuplớp:

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

Và cấu hình tuyến đường sẽ như sau:

app.UseMvc(routes =>
{
     routes.MapRoute(
        name: "default",
        template: "{controller:slugify}/{action:slugify}/{id?}",
        defaults: new { controller = "Home", action = "Index" });
});

Đối với API web ASP.NET Core 2.2:

Trong ConfigureServicesphương thức của Startuplớp:

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

Đối với ASP.NET Core> = 3.0 MVC:

Trong ConfigureServicesphương thức của Startuplớp:

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

Và cấu hình tuyến đường sẽ như sau:

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

Đối với ASP.NET Core> = 3.0 Web API:

Trong ConfigureServicesphương thức của Startuplớp:

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

Đối với ASP.NET Core> = 3.0 Trang Razor:

Trong ConfigureServicesphương thức của Startuplớp:

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

Điều này sẽ làm cho /Employee/EmployeeDetails/1tuyến đường đến/employee/employee-details/1


Tôi đã thử mã này và mã chính thức của Microsoft, nhưng biến thông số "slugify" không có tác dụng. Nó chỉ bị bỏ qua bởi hệ thống định tuyến (vì vậy các URL không được thay thế thành những đường đứt nét). Để tự kiểm tra, tôi đặt trình ghi nhật ký vào phương thức TransformOutbound (), nhưng không có lệnh gọi nào từ đó.
user3172616

Được chứ! Hãy để tôi kiểm tra làm ơn!
TanvirArjel

@ user3172616 Tôi đã kiểm tra nó ngay bây giờ! nó hoạt động như mong đợi! như tạo tuyến đường như employee-details. Bạn vui lòng chỉ cho tôi cấu hình của bạn được không?
TanvirArjel

@ user3172616 bạn có đang sử dụng định tuyến thuộc tính trên tuyến đường mà bạn đã thử nghiệm không?
TanvirArjel

Tôi sử dụng phương pháp định tuyến tiêu chuẩn (không phải định tuyến thuộc tính) trên giải pháp lõi v2.2 hoàn toàn mới trong Visual Studio. Có hai ảnh chụp màn hình (mã c # và mã .cshtml). Tôi đã cố gắng tạo liên kết theo nhiều cách khác nhau mà không có tác dụng. imgur.com/a/L8dCF6c
user3172616

20

Như các câu trả lời khác chỉ ra, thêm:

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

trước

services.AddMvc(...)

hoạt động tốt, nhưng tôi cũng muốn nói thêm rằng nếu bạn sử dụng Identity, bạn cũng sẽ cần:

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

Và hiển nhiên, hãy thay thế cả hai IdentityUserIdentityRolebằng các lớp của riêng bạn nếu cần.

Tôi vừa thử nghiệm điều này với .NET Core SDK 1.0.4 và thời gian chạy 1.0.5.


Định cấu hình <RouteOptions> () là câu trả lời tốt nhất imho: nhỏ và đi thẳng vào vấn đề (đã thử nghiệm trên mvc core 3.1)
T-moty

12

Đã tìm ra giải pháp.

Trong assembly: Microsoft.AspNet.RoutingMicrosoft.Extensions.DependencyInjectionkhông gian tên, bạn có thể thực hiện việc này trong ConfigureServices(IServiceCollection services)phương thức của mình :

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

15
Đối với ASP NET MVC CORE: services.AddRouting (options => {options.LowercaseUrls = true;});
Skorunka František

Microsoft.Extensions.DependencyInjection trong Microsoft.AspNetCore.Routing.dll
Skorunka František

3
Đây là sự thật trước khi RTM, bây giờ bạn nên sử dụng .AddRouting thay cho .ConfigureRouting
Yves Schelpe

1

Đối với danh tính, câu trả lời @Jorge Yanes Diez không hoạt động trong ASP.NET Core 2.2( tôi nghĩ là 2.x ), vì vậy nếu bạn sử dụng Identity và ASP.NET Core 2.2 (2.x) thì đây là giải pháp:

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

Tham khảo: Định cấu hình ASP.NET Core Identity


0

Tôi đã có cái này trên RegisterRoutes :: RouteConfig:

các tuyến đường.LowercaseUrls = true;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.