2

私は紙のカタログのように、入力/保存が簡単な「短いURL」をいくつか公開したいと考えていますが、SEOフレンドリな冗長なURLにリダイレクトする必要があります。 MVCルートでそれをどのように達成できますか?MVCでショートURLを作成するにはどうすればよいですか?

例:

  1. だけのセットアップそれのためのルート:

    http://mysite.com/disney

    は、私が試した

    http://mysite.com/travel/planning-your-disney-vacation (with "travel" as the Controller)

    ものになります。 問題: URLそれは「/ディズニー」のまま(ブラウザで変更されません

  2. 使用NuGetパッケージRouteMagic(Haacked's articleを参照)問題:。。私はエラーを取得する:RouteData項目を含まなければなりません私はコントローラー( "旅行")の前に( "foo"と "bar"で)静的な単語を持っていないので、これはだと思います

  3. Ian Mercer's問題:私が嫌いなURLを作成すると、ルートが自分のHTML.ActionLinksにマッチします(Haackedは彼の記事でこれを言い、thaなぜGetVirtualPathはNULLを返しますか?)

私はアイデアがありません。 ありがとう!

答えて

3

あなたはすべて/何かを指示するために、キャッチオールタイプのルートを設定できますが、特定の要求しますアクションとコントローラのようなもの:

routes.MapRoute(
    "ShortUrls", 
    "{name}", 
    new {controller = "ShortUrl", action = "Index", name = UrlParameter.Optional} 
); 

(ルーティングの残りの設定によっては、ルーティングの頭痛を引き起こす可能性があるため、このようなことはしたくないかもしれませんが、ここでは簡単にする)

は、それからちょうどあなたのアクションは、指定した値に基づいて、目的のURLにリダイレクトしています

public class ShortUrlController : Controller 
{ 
    // 
    // GET: /ShortUrl/ 

    public ActionResult Index(string name) 
    { 
     var urls = new Dictionary<string, string>(); 
     urls.Add("disney", "http://mysite.com/travel/planning-your-disney-vacation"); 
     urls.Add("scuba", "http://mysite.com/travel/planning-your-scuba-vacation"); 

     return Redirect(urls[name]); 
    } 
} 
+0

このアプローチの問題は、私がすでに "キャッチオール"ルートを持っていることです。これは動作しません(残念ながら)。 – WebDave

+0

ShortUrls catchallにルート制約を追加して、指定された文字列のリストにのみ一致させると、それはうまくいくでしょうか? – kristian

+0

クリスチャン、それは働いた!あなたの投稿を再読した後、あなたが提案していることを実際に理解する! - そしてRoute Constraintsを研究して、正規表現がうまくいく日にちを修正した後、私のタイプミスを修正しました。(あなたはその3つをコードのほんの少しだけ信じられますか?仕事に! ...私はほとんどそれを信じることができなかった! **ありがとうございました!!!!!** – WebDave

0

URLを短縮するには、URL書き換え手法を使用する必要があります。

テーマにいくつかのチュートリアル:

+0

4Guysの記事は、MVC以外のものです - 私は疑い - 2008年に書かれて以来最初のものです.2番目のものは唯一の "関連性"のものであり、役に立たないことは何も教えてくれません。 – WebDave

1

私はちょうど同じ問題に直面しました。私の世界で :私のホームコントローラーで

routes.MapRoute(
    "ShortUrls", 
    "{name}", 
    new { controller = "Home", action = "Index", name = UrlParameter.Optional } 
); 

public ActionResult Index(string name) 
{ 
    return View(name); 
} 

この方法では動的で、私は新しいページを追加するために必要なすべての時間を再コンパイルする必要がありますする必要はありませんでした。

関連する問題