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

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

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

Существуют некоторые вопросы: Как генерировать ссылки? (сохраните краткие заголовки в дб?) Перенаправление или не, если краткий заголовок не является каноническим?

править: по-видимому, их называют краткими заголовками

16
задан Ante 1 February 2010 в 05:54
поделиться

4 ответа

Я только что задал сегодня соответствующий вопрос по SO относительно генерирования слизняка, так же известного как "слизняк" или "слизняк".

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

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

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

2
ответ дан 30 November 2019 в 22:55
поделиться

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

 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% нахожусь на шаблоне Регекса, если какой-нибудь герой Регекса может перезвонить и предложить лучшее, что было бы здорово. От тестирования Регекса, он не совпадает с пробелами, но это не должно быть проблемой, потому что первая строка заменяет все пробелы дефисами.

Обновление:

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

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

        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;
}
2
ответ дан 30 November 2019 в 22:55
поделиться

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

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

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

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

  1. Обрезать строку начальных / конечных пробелов
  2. Отрезать диакритические знаки, используя функцию Майкла Каплана или эквивалентную
  3. Строку нижнего регистра для канонизации
  4. Замените все символы, отличные от слов, дефисами
4
ответ дан 30 November 2019 в 22:55
поделиться

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

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,}", "-");
    }

}
6
ответ дан 30 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: