0

記事のURLがwww.site.com/article/623/friendly-url-hereのasp.net MVC 4サイトがあります

フレンドリ URL なしで誰かが記事にアクセスした場合 、データベースへのリダイレクトとアクセスを 2 回行わずに記事が完了することは望ましくありません(ページの読み込みが遅くなります)。

今:

www.site.com/article/623 に入る -> www.site.com/article/623 に入る

私がしたいように:

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

(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; }
}
4

3 に答える 3

0

DBからフェッチしたデータをセッションオブジェクトに保存するときに、最終的に「RedirectToRoute」を使用しました。

リクエストフロー:

  1. URLにIDのみを含むリクエスト。
  2. データベースからページコンテンツを取得します。
  3. フェッチしたページをそのID(「article-53」など)で指定されたセッションオブジェクトに保存し、正しいルートにリダイレクトします。
  4. 存在する場合はセッションオブジェクトからページデータをフェッチし、セッションオブジェクトをクリーンアップします。

    public ActionResult ViewArticle(int?articleId、stringfriendlyUrl){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

この答えはあなたの問題の解決策ではありませんが、別の視点から見たものです:

リダイレクトせずにブラウザでアドレスを変更することはできません。

リンクの1つのバージョンのみをユーザーに公開することを確認する必要があります。Secondはリダイレクトしますが、特に1つのタイプのみが公開されている場合は、問題はありません。

この質問のアドレスは良い例です。に移動するとhttp://stackoverflow.com/questions/13671002、にリダイレクトされhttp://stackoverflow.com/questions/13671002/friendly-url-redirectionます。

検索エンジンで使用されるコピーが1つだけであることを確認するには、正規URLも配置する必要があります。

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

SEOに不向きなアドレスは、新しい形式で公開する必要があります。公開しない場合は、データベースクエリが2つになることはありません。

于 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 に答える