ASP. NET Маршрутизация основных атрибутов - префикс локали - PullRequest
2 голосов
/ 17 июня 2020

У меня есть следующий контроллер:

[Route("blog")]
[Route("{locale:regex(^(de|es|fr)$)}/blog", Order = -1)]
public class BlogController : Controller {
    [HttpGet("{id:int}.htm")]
    [HttpGet("{slug}/{id:int}.htm")]
    public IActionResult Details(string? slug, int id) {
        return View();
    }
}

Теперь, если я попытаюсь сгенерировать следующие URL-адреса:

  • @Url.Action («Подробности», «Блог», new {id = 1})
  • @Url.Action ("Подробности", "Блог", new {slug = "cat-1", id = 1})
  • @ Url. Действие ("Подробности", "Блог", новый {id = 1, locale = "fr"})
  • @Url.Action ("Подробности", "Блог", новый {slug = "cat-1 ", id = 1, locale =" fr "})

Я ожидал бы следующего:

  • / blog / 1.htm
  • / blog / cat-1 / 1.htm
  • / fr / blog / 1.htm
  • / fr / blog / cat-1 / 1.htm

Однако это возвращает:

  • / blog / 1.htm
  • / blog / 1.htm? Slug = cat-1
  • / fr / blog / 1. htm
  • / fr / blog / 1.htm? slug = cat-1

Я попытался изменить порядок всех атрибутов маршрутизации, но не могу заставить его вернуть желаемый результат, и буду признателен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 23 июня 2020

Следующий пример дает желаемые результаты:

public class BlogController : Controller
{
    [Route("{locale:regex(^(de|es|fr)$)}/blog/{slug}/{id:int}.htm")]
    [Route("{locale:regex(^(de|es|fr)$)}/blog/{id:int}.htm", Order = 1)]
    [Route("blog/{slug}/{id:int}.htm", Order = 2)]
    [Route("blog/{id:int}.htm", Order = 3)]
    public IActionResult Details(string? slug, int id)
    {
        return View();
    }
}

В этом подходе используется более ранний Order для более конкретных c маршрутов, поэтому сначала проверяются они. Очевидным недостатком является многословие, но это рабочее решение, основанное на описанных требованиях.

0 голосов
/ 18 июня 2020

Если вы не против изменить порядок slug, вы можете изменить контроллер следующим образом:

    [Route("blog")]
    [Route("{locale:regex(^(de|es|fr)$)}/blog", Order = -1)]
    public class BlogController : Controller
    {
        [HttpGet("{id:int}.htm/{slug?}")]
        public IActionResult Details(string? slug, int id)
        {
            return View();
        }
    }

Создайте следующие URL-адреса:

@Url.Action("Details", "Blog", new { id = 1 })
@Url.Action("Details", "Blog", new { slug = "cat-1", id = 1 })
@Url.Action("Details", "Blog", new { id = 1, locale = "fr" })
@Url.Action("Details", "Blog", new { slug = "cat-1", id = 1, locale = "fr" })

Результат:

/blog/1.htm
/blog/1.htm/cat-1
/fr/blog/1.htm
/fr/blog/1.htm/cat-1
...