0

我有 asp.net MVC 4 网站,文章 url 是:www.site.com/article/623/friendly-url-here

我不希望如果有人在没有友好 url 的情况下访问文章, 它将在不重定向和访问数据库两次的情况下完成(这会使页面加载速度变慢)。

现在:

进入 www.site.com/article/623 -> 进入 www.site.com/article/623

正如我想要的那样:

进入 www.site.com/article/623/the-article-nice-url

(注意添加的-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; }
}
4

3 回答 3

0

我最终使用了“RedirectToRoute”,同时将从数据库获取的数据存储在会话对象中。

请求流程:

  1. url 中只有 id 的请求。
  2. 从数据库中获取页面内容。
  3. 将获取的页面保存在以其 id 命名的会话对象中(例如“article-53”)并重定向到正确的路由。
  4. 如果存在,则从会话对象中获取页面数据并清理会话对象。

    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 });
            }
        }
    
于 2012-12-02T16:59:04.397 回答
0

这个答案不是解决你的问题,而是从不同的角度来看:

您无法在没有重定向的情况下修改浏览器中的地址。

您应该确定,您只向用户公开一个版本的链接。第二个将重定向并且没有任何问题,特别是当只暴露一种类型时。

这个问题的地址就是很好的例子。如果你去http://stackoverflow.com/questions/13671002,你会被重定向到http://stackoverflow.com/questions/13671002/friendly-url-redirection

为确保搜索引擎只使用一份副本,您还应该放置规范网址:

<link rel="canonical" href="http://stackoverflow.com/questions/13671002/friendly-url-redirection">

SEO 不友好的地址应该以任何形式更新。如果您不公开它,您将不会有双重数据库查询。

于 2012-12-02T17:04:27.530 回答
0

您需要使用 Url 重写来实现这一点。您可以选择多种技术,具体取决于您希望处理将文章 ID 映射到友好 url 的方式。查看这篇文章以获取可用选项的摘要:http ://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

于 2012-12-02T17:05:44.057 回答