Маршрутизация вопросов о переполнении стека

StackOverflow https://stackoverflow.com/questions/677158

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top