Маршрутизация вопросов о переполнении стека
-
21-08-2019 - |
Вопрос
Если вы просмотрите URL-адрес вопроса SO, вы увидите, что идентификатор и "SLUG" передаются контроллеру вопросов: https://stackoverflow.com/questions/676934/what-do-you-need-to-write-your-own-blog-engine.Что я нахожу интересным, так это то, что вы можете изменить часть URL-адреса "SLUG", не влияя на способность приложения направлять запрос пример.Единственный способ, который я мог придумать, чтобы осуществить это, - это создать маршрут, который принимал идентификатор и "SLUG" и использовал ограничение маршрута для slug, чтобы гарантировать, что он следует шаблону.Мне пришлось использовать ограничение, чтобы гарантировать, что наличие двух переменных не приведет к тому, что этот маршрут будет соответствовать всем запросам.Есть ли у кого-нибудь лучший способ добиться этого или какие-либо примеры более продвинутых сценариев маршрутизации?
ДОПОЛНЕНИЕ:
Я понимаю, что SLUG предназначен для удобства чтения человеком, и я хотел бы дублировать эту функцию в другом приложении.Каков наилучший способ добиться этого?
Маршрут:
routes.MapRoute(
"Id + Slug", // Route name
"Test/{id}/{slug}", // URL with parameters
new // Parameter defaults
{
controller = "Test",
action = "Details",
id = "",
slug = ""
},
new { slug = new SlugConstraint() }
);
Простое ограничение:
public class SlugConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
string value = values[parameterName].ToString();
return value.Contains("-");
}
}
Решение
Является это то, что вы смотрите for...it не определяет заглушку в конце.
Другие советы
Вам вообще не нужно использовать slug.Вероятно, это просто для удобства чтения человеком и поисковой оптимизации.Вы можете игнорировать это при маршрутизации и просто работать с идентификатором.
Например, нажмите здесь:
Слизень предназначен для того, чтобы поисковые системы могли каталогизировать ресурс / страницу.Он вообще не используется в маршруте как часть аргументов, передаваемых в базу данных для извлечения запрошенной записи.
Идентификатор - это важная часть.
Таким образом, в вашем коде SlugConstraint не требуется, и значение аргумента slug игнорируется в действии Details .
Это поведение - это то, что делает SO и что вы можете сделать, если захотите скопировать SO.
"Маршрутом" может быть все, для чего может быть настроен маршрутизатор.Динамические части "маршрута" затем передаются на целевую страницу и извлекаются с помощью метода RouteValue() (в разделе ASP.NET Маршрутизация).То, что вы делаете с этими значениями на целевой странице, полностью зависит от вас.Используйте их или игнорируйте.
Таким образом, идентификатор (в вашем примере) является ключевым, а остальное (slug) предназначено только для удобства чтения человеком и SEO.