不确定它是否是最佳解决方案,但我可以说我有这样的网址
?id=2
Id取自数据库,如何使其显示
/<article_title_name>/
而不是id。
我已经谷歌搜索了几个小时了,我真的无法找到如何检索文章名称,而它仍然会显示所选文章的目标ID,但网址只是不同。
不确定我是否做得很好。
答案 0 :(得分:0)
以下是我将如何做slug链接:
这应该让你的生活变得更容易一点,而不是必须反向魔术一些魔法,将string
匹配到帖子的标题中才能找到ID。
这里......
在您的模特上有另一个属性:
在数据库表格/模型中为您的Article
创建另一个列/属性,名为sluglink
或您选择的内容,同样有意义。
创建生成它们的方法:
将文章保存到数据库/存储库等时,可以创建一个可以为您创建链接并将其存储在该字段中的函数。
这样,您就不必将魔术字符串反向工程为ID;你可以在数据库/商店等中找到匹配的slug并以这种方式返回。
有一个很棒的功能(感谢this post) - 帖子本身在创建扩展方法时给出了方法;我刚刚调整了它并将其压缩成一个函数以简化,以防您不确定扩展方法:
public string GenerateSlug(string postTitle)
{
var str = System.Text.Encoding.ASCII.GetString(System.Text.Encoding
.GetEncoding("Cyrillic")
.GetBytes(postTitle));
// invalid chars
str = Regex.Replace(str, @"[^a-z0-9\s-]", "");
// convert multiple spaces into one space
str = Regex.Replace(str, @"\s+", " ").Trim();
// cut and trim
str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim();
str = Regex.Replace(str, @"\s", "-"); // hyphens
return str;
}
取决于你想要放置此功能的位置;我会让你决定。
生成并存储slu ::
调用GenerateSlug
方法,传递PostTitle
或任何你想要的“slugify”;它会为你的“slug”返回一个漂亮的字符串。
然后将该字符串存储到您的数据库/商店等。
检索文章
非常简单,诚实。
在路由表中,您可以将其转换回WebForm,然后找到正确的文章。以下是有关如何执行此操作的良好链接:http://weblogs.asp.net/scottgu/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series
然后,从您的存储库/商店中以与GetArticleById(1234)
几乎相同的方式;我会创建另一种方法 - 猜猜... GetArticleBySlug(heres-a-great-article)
- 或者再一次,你喜欢什么。
<强>最后强>
为了保持纯粹,我仍然可以通过ID进行选择,以防你正在调试或者不管情况如何(如果它是一个很长的文章名称,可以节省输入整个slug)。
这应该让你起步并继续前往一些看起来很漂亮的slu :: :)
希望这有帮助!