Как добавить заголовок страницы в 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: видимо, они называются слизнями
Ответы
Ответ 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)
.