如何动态创建网址/链接,例如: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132
我可以使用哪些关键字来搜索有关此主题的文章? (如何在asp.net mvc中生成和处理这种URL)
有一些问题: 如何生成链接? (在db中存储slu ??) 如果slug不是规范的话,是否重定向?
编辑:显然他们被称为slugs
答案 0 :(得分:6)
您必须使用以下内容。
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,}", "-");
}
}
答案 1 :(得分:4)
我总是在数据库中存储slugs以及它们引用的任何实体。所以对于博客文章,你会在“posts”表中有一个“slug”字段。
要在ASP.Net中处理它MVC很简单 - 你只需使用一个常规路径来捕获参数中的slug(甚至可能只是使用{id}),然后你的控制器会查找数据库中的slug ,加载实体,并正常显示。
虽然您可以使用简单的RegEx来替换空间以及诸如此类的东西来生成您的slu ,,但实际上这很快就会崩溃。您需要考虑标题中可能出现的各种字符。迈克尔卡普兰的博客与这个目的密切相关; he's shared a function会从字符串中删除变音符号。
因此,您的“生成slug”算法通常应采用以下形式:
答案 2 :(得分:2)
执行此操作的一种方法是在字符串
上执行以下操作 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开始,它与空格不匹配,但这不应该是一个问题,因为第一行用连字符替换所有空格。
<强>更新强>
要使用此代码,您需要设置路线以接受额外参数。
我们将以博客文章标题为例。
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 helper。
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;
}
答案 3 :(得分:2)
我今天刚刚问了一个relevant question关于生成slug的问题,名为/ slugify标题。
当使用slug获取URL时,您可以创建一个同时包含ID
(和其他必需参数)和slug
的操作,并简单地忽略该slug。
public ActionResult Foobar(int id, string slug)
{
//-- Do Something
}
或更优雅,使用地图路线忽略您网址后面的试用字符串并映射到Foobar(int id)
。