Как динамично создать URL/ссылки как: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132
каковы ключевые слова, которые я могу использовать для гугления некоторых статей об этой теме? (как к genererate и дескриптору этот вид URL в asp.net mvc)
Существуют некоторые вопросы: Как генерировать ссылки? (сохраните краткие заголовки в дб?) Перенаправление или не, если краткий заголовок не является каноническим?
править: по-видимому, их называют краткими заголовками
Я только что задал сегодня соответствующий вопрос по SO относительно генерирования слизняка, так же известного как "слизняк" или "слизняк".
При получении URL-адреса с помощью slug, вы можете либо создать действие, которое принимает как ID
(и другие необходимые аргументы), так и slug
и просто игнорирует slug.
public ActionResult Foobar(int id, string slug)
{
//-- Do Something
}
Или более элегантно, используйте маршрут карты, чтобы игнорировать строку пробной версии за вашим URL и карту к Foobar(int id)
.
Один из способов сделать это следующий на вашей строке
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;
}
Я всегда хранил ярлыки в базе данных вместе с любыми объектами, на которые они будут ссылаться. Итак, для сообщения в блоге у вас будет поле «slug» в таблице «posts».
Чтобы обработать это в ASP.Net MVC прост - вы просто используете обычный маршрут, который захватит слаг в параметре (возможно, даже просто используя {id}), а затем ваш контроллер будет искать слаг в базе данных, загружать объект и отображать его как обычный.
Несмотря на то, что вы можете использовать простое регулярное выражение для замены пробелов и прочего для создания ваших ярлыков, на самом деле это довольно быстро выходит из строя. Вы должны учитывать все типы персонажей, которые могут появиться в ваших заголовках. Блог Майкла Каплана был связан с этой конкретной целью; он поделился функцией , которая удаляет диакритические знаки из строк.
Таким образом, ваш алгоритм "создания заголовка" обычно должен иметь следующий вид:
Вы должны использовать следующее.
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,}", "-");
}
}