Ссылка Маршрутизация в ASP.NET Core
Вы можете использовать символ *
в качестве префикса для параметра маршрута для привязки к остальной части URI - этоназывается параметром catch-all .Например, blog/{*slug}
будет соответствовать любому URI, который начинается с /blog
и имеет любое значение после него (которое будет назначено значению маршрута slug).Параметры Catch-all также могут соответствовать пустой строке.
Ссылка Маршрутизация к действиям контроллера в ASP.NET Core
Вы можете применить ограничения маршрута, чтобы убедиться, чточто id
и заголовок не конфликтуют друг с другом, чтобы получить желаемое поведение.
[Route("en/blogs")]
public class BlogController : Controller {
//Match GET en/blogs/19
//Match GET en/blogs/19/the-automotive-industry-latest
[HttpGet("{id:long}/{*slug?}", Name = "blogs_endpoint")]
[AllowAnonymous]
public IActionResult GetBlog(long id, string slug = null) {
var blog = _context.Blogs.FirstOrDefault(b => b.Id == id);
if(blog == null)
return NotFound();
//TODO: verify title and redirect if they do not match
if(!string.Equals(blog.slug, slug, StringComparison.InvariantCultureIgnoreCase)) {
slug = blog.slug; //reset the correct slug/title
return RedirectToRoute("blogs_endpoint", new { id = id, slug = slug });
}
return Json(blog);
}
}
Это следует той же схеме, что и StackOverflow для своих ссылок
questions/50425902/add-text-to-urls-instead-of-int-id
Тактеперь ваши ссылки могут включать в себя слова, удобные для поиска, которые должны помочь с ссылками на нужные статьи
GET en/blogs/19
GET en/blogs/19/The-Automotive-Industry-Latest.
Я бы предложил создать слаг в качестве поля / свойства на основе заголовка блога при сохранении блога в базе данных,убедившись, что санируйте заголовок полученного заголовка любых недопустимых символов URL.