gpt4 book ai didi

c# - 在 ASP.NET Core 中自动生成小写虚线路由

转载 作者:行者123 更新时间:2023-12-02 23:32:01 25 4
gpt4 key购买 nike

ASP.NET Core 使用 CamelCase-Routes,如 http://localhost:5000/DashboardSettings/Index默认情况下。但我想使用小写路由,由破折号分隔:http://localhost:5000/dashboard-settings/index它们更加常见和一致,因为我的应用程序扩展了一个运行 Wordpress 的网站,该网站也有带破折号的小写 URL。

我了解到我可以使用路由选项将网址更改为小写:

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

这有效,但给我的网址没有任何分隔符,如 http://localhost:5000/dashboardsettings/index可读性很差。我可以使用像

这样的路由属性来定义自定义路由
[Route("dashboard-settings")]
class DashboardSettings:Controller {
public IActionResult Index() {
// ...
}
}

但这会导致额外的工作并且容易出错。我更喜欢一个自动解决方案,它搜索大写字符,在它们前面插入破折号并使大写字符小写。对于旧的 ASP.NET 这不是一个大问题,但在 ASP.NET Core 上我看不到如何处理这个问题的指示。

这里有什么方法可以做到这一点?我需要某种可以生成 url(例如标签助手)的界面,并用破折号分隔符替换 CamelCase。然后我需要另一种路由接口(interface),以便将破折号分隔符 url 转换回 CamelCase,以便与我的 Controller /操作名称正确匹配。

最佳答案

ASP.NET Core 版本 >= 2.2 中的更新

为此,首先创建 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:

Startup类的ConfigureServices方法中:

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:

Startup类的ConfigureServices方法中:

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:

Startup类的ConfigureServices方法中:

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:

Startup类的ConfigureServices方法中:

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

对于 ASP.NET Core >=3.0 Razor 页面:

Startup类的ConfigureServices方法中:

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

这将使 /Employee/EmployeeDetails/1 路由到 /employee/employee-details/1

关于c# - 在 ASP.NET Core 中自动生成小写虚线路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40334515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com