Я хочу настроить маршруты в зависимости от культуры веб-приложения, чтобы иметь «дружественный» 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
(хорошо)