我如何在MVC中做短网址?

时间:2012-03-01 05:25:11

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

假设我想发布(如纸质目录中)一些易于输入/记忆的“短网址”,但我希望它们重定向到详细的,SEO友好的网址。如何使用MVC路由实现这一目标?

示例:

  

http://mysite.com/disney

成为

  

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

我尝试过的事情:

  1. 只需为其设置路线即可。 问题:网址在浏览器中没有变化(它保持“/ disney”。

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

  3. 使用重定向模块(如Ian Mercer's)。 问题:在创建我不想要的网址时,我的HTML.ActionLinks上的路径匹配(Haacked在他的文章中提到这一点,并说这就是为什么他让GetVirtualPath返回NULL ......?)
  4. 我没有想法,所以任何人都会感激不尽! 谢谢!

2 个答案:

答案 0 :(得分:3)

您可以设置一个包含所有类型的路由,将所有/某些请求定向到特定的操作和控制器,例如:

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

(取决于您的路由的其余部分是如何设置的,您可能不希望这样做,因为它可能会导致一些严重的路由问题 - 但这样做是为了简单起见)< / p>

然后根据指定的值将您的操作重定向到所需的网址:

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

答案 1 :(得分:0)

要缩短网址,您应使用网址重写技术。

关于主题的一些教程: