使用routes.MapPath来容纳缺少的URL参数

时间:2012-10-18 20:40:54

标签: asp.net-mvc model-view-controller

我有一个MVC网站,过去常常使用标准格式的URL:Controller / Action。

最近,我已将其更改为:Site/Controller/Action.

问题是,我的网站有几个链接,它们遵循旧格式,我想相应地重定向它们。

例如:mydomain.com/Home/CustomerSearch现在应该转到mydomain.com/Online/Home/CustomerSearch

而:mydomain.com/AffiliatesHome/CustomerSearch现在应该转到mydomain.com/Affiliate/AffiliatesHome/CustomerSearch

如何通过添加额外的路由来处理重定向,具体取决于它们所带来的链接?

我正在使用的当前路由是:

 routes.MapRoute(
      "Default", // Route name
      "{site}/{controller}/{action}/{id}",              
      new {site="IS", controller = "Home", action = "Index", id = UrlParameter.Optional }
   );

1 个答案:

答案 0 :(得分:1)

由于我没有在旧到新的URL映射中看到模式,我建议添加与旧的Controller / Action Schema匹配的路由,并将它们映射到新的Site / Controller / Action路由模式。

所以你可以添加以下路线

routes.MapRoute(
   "LegacyHome", 
   "Home/{action}/{id}", 
   new { site="Online", controller = "Home", action = "Index", id = UrlParameter.Optional } 
);

routes.MapRoute(
  "LegacyAffiliates", 
  "AffiliatesHome/{action}/{id}", 
  new { site="Affiliate", controller = "AffiliatesHome", action = "Index", id = UrlParameter.Optional } 
);

从SEO的角度来看,这并不理想,因为同一页面有不同的URL。通过状态码301的永久重定向和在该位置传递的新URL更适合。

您可以构建一个重定向控制器并使用旧版路由将遗留URL映射到重定向控制器,就像这样

routes.MapRoute(
           "LegacyHome",
           "Home/{newAction}/{id}",
           new { controller = "Redirect", action = "Redirect", newSite = "Online", newController="Home", newAction = "Index", id = UrlParameter.Optional }
        );

重定向控制器的代码

    public class RedirectController : Controller
{
    public ActionResult Redirect(string newSite, string newController, string newAction)
    {
        var routeValues = new RouteValueDictionary(
            new
                {
                    site = newSite,
                    controller = newController,
                    action = newAction
                });

        if (RouteData.Values["id"] != null)
        {
            routeValues.Add("id", RouteData.Values["id"]);
        }

        return RedirectToRoutePermanent(routeValues);
    }
}