ASP.NET MVC路由/SEO友好的URL

9

我想做类似stackoverflow的东西。

以stackoverflow的链接为例:

C#的隐藏功能?

如果你删除最后一部分(C#的隐藏功能?),它仍然返回相同的结果。

在我的Global.asax路由中,我尝试这样做:“{action}/{id}/{title}”

这是我的页面上的链接:

<%= Html.ActionLink(video.Title, "Details", "Videos", new {id = video.ID, title = video.Title.Replace(" ", "-")}, null) %>

这个代码基本上实现了我想要的功能,但在id后面添加了?title=blah-blah-blah

我希望它显示id/blah-blah-blah

我的问题是什么?(除了我是个新手)


你能发布一下 global.asax.cs 中的所有路由吗?也许有另一个路由被优先匹配了... - Peter
@Peter 确实是这种情况。 - Muad'Dib
2个回答

9

很棒的帖子。我可以建议在您的SeoName方法的末尾放置.Trim(' - '),以防止像“ One(Two)”这样的内容变成“ one-two-”。 - dav_i
非常完美!特别适合我从WebForm迁移到MVC。 - Reza Mortazavi
一个补充:SeoName(string name) 无法处理Unicode字符串,例如 _درباره ما_,除非进行显式的URL编码。即 HttpContext.Current.Server.UrlEncode(Regex.Replace(input.ToLower().Replace(@"'", String.Empty), @"[^\w]+", "-")); 我不知道原因。如果不进行编码,它会抛出404异常。 - Reza Mortazavi
已更新为链接的互联网档案馆版本。 - George Stocker

5

看起来你使用ActionLink时选择了正确的路由,但这只是我的猜测。请问你是否在默认路由之后注册了{action}/{id}/{title}路由?如果是的话,默认路由会先匹配,然后将标题值放入查询字符串中,因为它不出现在路径中。如果你在{controller}/{action}/{id}默认路由之前注册自定义路由,应该就可以解决问题了。


它在默认路由之前注册,不过你指出了我的正确方向。问题实际上确实取决于已注册路由的顺序。 谢谢。 - Muad'Dib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接