【问题标题】:How do I do Short URLs in MVC?如何在 MVC 中创建短 URL?
【发布时间】:2012-03-19 15:26:23
【问题描述】:

假设我想发布(比如在纸质目录中)一些易于输入/记忆的“短 URL”,但我希望它们重定向到一个冗长的、对 SEO 友好的 URL。如何使用 MVC 路由实现这一点?

例子:

http://mysite.com/disney

变成

http://mysite.com/travel/planning-your-disney-vacation(以“travel”为控制器)

我尝试过的事情:

  1. 只需为它设置一条路线。 问题: URL 在浏览器中没有改变(它保持“/disney”。

  2. 使用 NuGet 包 RouteMagic(请参阅 Haacked's article)。 问题: 我收到一个错误:RouteData 必须包含一个名为“controller”的项目,其值为非空字符串。我认为这是因为我的控制器(“travel”)之前没有像他那样(带有“foo”和“bar”)的静态词???

  3. 使用重定向模块(如Ian Mercer's)。 问题:在创建我不想要的 URL 时,路由与我的 HTML.ActionLinks 匹配(Haacked 在他的文章中提到了这一点,并说这就是为什么他让 GetVirtualPath 返回 NULL ...?)

我没有想法,所以任何将不胜感激! 谢谢!

【问题讨论】:

    标签: asp.net-mvc model-view-controller routing routes short-url


    【解决方案1】:

    要缩短 URL,您应该使用 URL 重写技术。

    一些关于主题的教程:

    【讨论】:

    • 4Guys 的文章不是 MVC,因为它是 2008 年写的第一篇文章。第二篇文章是唯一的“相关”文章,并没有告诉我任何有用的信息。
    【解决方案2】:

    您可以设置一个包罗万象的路由,将所有 /something 请求定向到特定的操作和控制器,例如:

    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]);
        }
    }
    

    【讨论】:

    • 这种方法的问题是我已经有一个“catchall”路由,所以这行不通(......不幸的是)。
    • 如果您将路由约束添加到 ShortUrls 总括中以仅匹配指定的字符串列表,这对您有用吗?
    • 克里斯蒂安,成功了!重新阅读您的帖子后 - 真正了解您的提议! - 和研究路线约束的日子,然后想出可行的正则表达式,然后修复我的错字(你能相信 - 其中的 3 个在一点点代码中!?!??),我终于明白了去工作! ……我简直不敢相信! 谢谢!!!!
    【解决方案3】:

    我刚刚遇到了同样的问题。 在我的全球:

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

    在我的家庭控制器中:

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

    这种方式是动态的,不想每次需要添加新页面时都重新编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2010-09-18
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多