Asp.Net Core Routing с использованием преобразователя параметров и в зависимости от культуры - PullRequest
0 голосов
/ 14 января 2019

Я хочу настроить маршруты в зависимости от культуры веб-приложения, чтобы иметь «дружественный» URL (для оптимизации SEO). Например, для контроллера с именем «FirstItemController» и представления с именем «TheIndexView»:

  • www.myapp.com / пт / пн-премьер-элемент / л-вю-индекс
  • www.myapp.com / ен / мой-первый элемент / индекс вида
  • www.myapp.com / эс / мл-праймер-Elemento / л-перспектива-индекс

Asp.Net Core 2.2 представляет концепцию преобразования параметров в маршрутизацию (https://blogs.msdn.microsoft.com/webdev/2018/10/17/asp-net-core-2-2-0-preview3-now-available/ + https://www.hanselman.com/blog/ASPNETCore22ParameterTransformersForCleanURLGenerationAndSlugsInRazorPagesOrMVC.aspx)

Я знаю, эти статьи были написаны для предварительного просмотра 2.2.0 3.

На данный момент я создал класс SlugifyParameterTransformer и зарегистрировал его в параметрах AddMvc:

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

Я пробовал два подхода в вариантах маршрутов:

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

Это работает: MyFirstItemController. URL-адресInIndexView - это "my-first-item / the-index-view". Теперь, как я могу локализовать свои URL?

Я пытался добавить RouteAttribute и 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()
    { /*...*/ }
}

Я не знаю, что я могу использовать в качестве значения имени HttpGetAttribute. Эти URL работает:

  • fr/mon-premier-element/ (хорошо)
  • en/mon-premier-element/ (НЕ хорошо)
  • fr/my-first-item (НЕ хорошо)
  • en/my-first-item (хорошо)
...