我有asp.net MVC 4网站,文章网址是:www.site.com/article/623/friendly-url-here
如果有人在没有友好网址的情况下访问文章,我不会这样做 它将完成,无需重定向和访问数据库两次(这会使页面加载速度变慢)。
立即
进入www.site.com/article/623 - >进入www.site.com/article/623
正如我所希望的那样:
进入www.site.com/article/623/the-article-nice-url
(注意添加的文章 - 漂亮的网址)
更新:
在RouteConfig中使用路由:
// Articles
routes.MapRoute(
name: "Articles",
url: "articles/{articleId}/{friendlyUrl}",
defaults: new { controller = "PageManagement", action = "ViewArticle", articleId = UrlParameter.Optional, friendlyUrl = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
我用来存储DbContext数据的页面元数据:
public class PageMetadata
{
[Key]
public int Id { get; set; }
public string RepresentationString { get; set; }
public DateTime CreationDate { get; set; }
public DateTime LastUpdateDate { get; set; }
public bool IsVisible { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public string Link { get; set; }
}
答案 0 :(得分:0)
我最终使用了#34; RedirectToRoute"同时将从DB中提取的数据存储在会话对象中。
请求流程:
从会话对象中获取页面数据(如果存在)并清理会话对象。
public ActionResult ViewArticle(int?articleId,string friendlyUrl) { if(articleId == null) { return RedirectToActionPermanent(" Index"," Home"); }
if (Session[string.Format("article-{0}", articleId)] != null)
{
PageMetadata desiredPage = (PageMetadata)Session[string.Format("article-{0}", articleId)];
Session[string.Format("article-{0}", articleId)] = null;
return View(desiredPage);
}
var page = context.PageMetadatas.FirstOrDefault(p => p.Id == articleId);
if (page == null)
{
return RedirectToActionPermanent("Index", "Home");
}
if (friendlyUrl != null)
{
// Redirect to proper name
if (friendlyUrl != page.RepresentationString)
{
Session[string.Format("article-{0}", page.Id)] = page;
return RedirectToRoute("Articles", new { controller = "PageManagement", action = "ViewArticle", articleId = articleId, friendlyUrl = page.RepresentationString });
}
return View(page);
}
else
{
Session[string.Format("article-{0}", page.Id)] = page;
return RedirectToRoute("Articles", new { controller = "PageManagement", action = "ViewArticle", articleId = articleId, friendlyUrl = page.RepresentationString });
}
}
答案 1 :(得分:0)
这个答案并不能解决你的问题,而是从不同的角度来看:
您无法在不重定向的情况下修改浏览器中的地址。
您应该确定,您只向用户公开了一个版本的链接。第二个将重定向,并没有任何错误,特别是当只有一种类型暴露。
这个问题的地址就是一个很好的例子。如果您转到http://stackoverflow.com/questions/13671002
,您将被重定向到http://stackoverflow.com/questions/13671002/friendly-url-redirection
。
为确保搜索引擎只使用一个副本,您还应该放置canoncal url:
<link rel="canonical" href="http://stackoverflow.com/questions/13671002/friendly-url-redirection">
SEO不友好的地址应该以任何形式暴露。如果你没有公开它,你就不会有双重数据库查询。
答案 2 :(得分:0)
您需要使用Url重写来实现此目的。您可以选择各种技术,具体取决于您希望处理将文章ID映射到友好URL的方式。查看此文章,了解可用选项的摘要:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx