2

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

例子:

http://mysite.com/disney

变成

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

我尝试过的事情:

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

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

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

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

4

3 回答 3

3

您可以设置一个包罗万象的路由,将所有 /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]);
    }
}
于 2012-03-01T06:26:54.613 回答
1

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

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

在我的家庭控制器中:

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

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

于 2012-08-17T11:37:31.093 回答
0

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

关于主题的一些教程:

于 2012-03-01T05:35:40.887 回答