假设我想发布(比如在纸质目录中)一些易于输入/内存的“短 URL”,但我希望它们重定向到一个冗长的、对 SEO 友好的 URL。如何使用 MVC 路由实现这一点?
例子:
http://mysite.com/disney
变成
http://mysite.com/travel/planning-your-disney-vacation (with "travel" as the Controller)
我尝试过的事情:
只需为它设置一条路线。 问题: URL 在浏览器中没有改变(它保持“/disney”。
使用 NuGet 包 RouteMagic(参见 Haacked's article)。 问题: 我收到一个错误:RouteData 必须包含一个名为“controller”的项目,并且该项目具有非空字符串值。我认为这是因为我的 Controller (“travel”)之前没有像他那样(带有“foo”和“bar”)的静态词???
- 使用重定向模块(如 Ian Mercer's)。 问题:在创建我不想要的 URL 时,我的 HTML.ActionLinks 上的路由匹配(Haacked 在他的文章中提到了这一点,并说这就是为什么他让 GetVirtualPath 返回 NULL ...?)
我没有想法,所以任何将不胜感激!谢谢!
您可以设置一个包罗万象的路由,将所有/something 请求定向到特定的操作和 Controller ,例如:
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]);
}
}
我是一名优秀的程序员,十分优秀!