Как добавить заголовок страницы в URL в asp.net mvc? (генерация URL) - PullRequest
16 голосов
/ 01 февраля 2010

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

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

Есть несколько вопросов: Как генерировать ссылки? (хранить слизняки в БД?) Перенаправить или нет, если пуля не является канонической?

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

Ответы [ 4 ]

6 голосов
/ 01 февраля 2010

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

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

}
4 голосов
/ 01 февраля 2010

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

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

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

Итак, ваш алгоритм «генерировать слаг» должен обычно иметь вид:

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

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

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

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

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

2 голосов
/ 01 февраля 2010

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

 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;
}
...