使用参数转换器并根据文化进行 Asp.Net Core 路由

And*_*era 5 url localization routes asp.net-core asp.net-core-2.2

我想根据 Web 应用程序的文化自定义路由,以获得“友好”的 url(以优化 SEO)。例如,对于名为“FirstItemController”的控制器和名为“TheIndexView”的视图:

  • www.myapp.com/fr/mon-premier-element/la-vue-index
  • www.myapp.com/en/my-first-item/the-index-view
  • www.myapp.com/es/mi-primer-elemento/la-vista-index

Asp.Net Core 2.2 将参数转换器的概念引入路由(https://blogs.msdn.microsoft.com/webdev/2018/10/17/asp-net-core-2-2-0-preview3-now-可用/ + https://www.hanselman.com/blog/ASPNETCore22ParameterTransformersForCleanURLGenerationAndSlugsInRazorPagesOrMVC.aspx )

我知道,这些文章是为 2.2.0 预览版 3 编写的。

目前,我已经创建了该类SlugifyParameterTransformer并将其注册在AddMvcoptions 中:

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string TransformOutbound(object value)
    {
        if (value == null) { return null; }

        // Slugify value
        return Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在路线选项中尝试了两种方法:

app.UseMvc(routes => routes.MapRoute("default", "{culture=fr}/{controller=Home}/{action=Index}/{id?}")); 
// works

// AND

app.UseMvc(routes => routes.MapRoute("default", "{culture=fr}/{controller=Home:slugify}/{action=Index:slugify}/{id?}"));
// dosn't works, I don't know where I declare "slugify" for the url template
Run Code Online (Sandbox Code Playgroud)

它的工作原理是:MyFirstItemController.TheIndexView url 是“my-first-item/the-index-view”。现在,我如何本地化我的网址?

我尝试添加RouteAttributeand HttpGetAttribute

[Route("{culture=fr}/mon-premier-element")]
[Route("{culture=en}/my-first-item")]
public class MyFirstItemController : Controller
{
    [HttpGet("???????")] // for moment: [controller]/[action]
    public IActionResult TheIndexView()
    { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)

我不知道 HttpGetAttribute 的 Name 值可以使用什么。这些网址有效:

  • fr/mon-premier-element/(好的)
  • en/mon-premier-element/(不好)
  • fr/my-first-item(不好)
  • en/my-first-item(好的)