Подтвердить что ты не робот

Как добавить заголовок страницы в url в asp.net mvc? (генерация URL)

Как динамически создавать URL-адреса, например: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132

какие ключевые слова я могу использовать для google некоторые статьи по этой теме? (как генерировать и обрабатывать такие URL-адреса внутри asp.net mvc)

Есть несколько вопросов: Как создать ссылки? (хранить слизняки в db?) Перенаправить или нет, если slug не является каноническим?

edit: видимо, они называются слизнями

4b9b3361

Ответ 1

Вы должны использовать что-то следующим образом.

Routes.MapRoute(
    "Post",
    "posts/{id}/{*title}",
    new { controller = "Posts", action = "view" }
);

И простой метод расширения:

public static class UrlExtensions
{

    public static string ResolveSubjectForUrl(this HtmlHelper source, string subject)
    {
        return Regex.Replace(Regex.Replace(subject, "[^\\w]", "-"), "[-]{2,}", "-");
    }

}

Ответ 2

Я всегда хранил пули в базе данных наряду с тем, на что ссылается их сущность. Итак, для сообщения в блоге у вас будет поле "slug" в таблице "posts".

Чтобы справиться с этим в ASP.Net MVC, вы просто используете обычный маршрут, который будет захватывать slug в параметре (возможно, даже с помощью {id}), а затем ваш контроллер будет искать пул в базе данных, загрузить объект и отобразить его как обычно.

Несмотря на то, что вы можете использовать простой RegEx для замены пробелов и еще чего генерировать свои пули, на самом деле это довольно быстро ломается. Вы должны учитывать все виды символов, которые могут появляться в ваших заголовках. Блог Майкла Каплана был тесно связан с этой целью; он поделился функцией, которая разделит диакритические метки от строк.

Таким образом, ваш алгоритм "генерировать слизню" должен иметь форму:

  • Обрезать строку ведущего/конечного пробела
  • Полоса диакритических знаков с использованием функции Майкла Каплана или эквивалента
  • Строка строки для канонизации
  • Заменить все символы без слова чертами

Ответ 3

Одним из способов сделать это является следующее в вашей строке

 string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens
 cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens

Теперь вы можете передать команду cleanString (для заголовков, имен и т.д.) В параметры ActoinLink/Url.Action, и она будет отлично работать.

Шаблон был взят с http://snipplr.com/view/18414/string-to-clean-url-generator/

Я не на 100% уверен в паттерне Regex, если какой-нибудь герой Regex может вмешаться и предложить лучший, который был бы великолепен. После тестирования Regex он не соответствует пробелам, но это не должно быть проблемой, потому что первая строка заменяет все пробелы дефисами.

Обновить:

Чтобы использовать этот код, вам нужно настроить свои маршруты, чтобы принимать дополнительные параметры.

Мы будем использовать заголовок статьи блога в качестве примера.

        routes.MapRoute(
            "",                                              // Route name
            "View/{ID}/{Title}",                           // URL with parameters
            new { controller = "Articles", action = "View"}  // Parameter defaults
        );

В ваших представлениях ASP.NET MVC вы можете сделать следующее:

  <%= Html.ActionLink("View Article", "View", "Articles", new { ID = article.ID, Title = Html.SanitizeTitle(article.Title) }, null) %>

В предыдущем примере я использую SanitizeTitle в качестве помощника HTML.

public static string SanitizeTitle(this HtmlHelper html, string originalString)
{
     string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string then replaces spaces with hyphens
     cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens
     return cleanString;
}

Ответ 4

Я просто спросил соответствующий вопрос сегодня о SO относительно создания slug, aka/slugify title.

При извлечении URL-адреса с помощью slug вы можете либо создать действие, которое принимает как ID (и другие обязательные аргументы), так и slug и просто игнорирует пул.

public ActionResult Foobar(int id, string slug)
{
    //-- Do Something
}

Или более изящный, используйте маршрут карты, чтобы игнорировать пробную строку за вашим URL-адресом и перейти к Foobar(int id).