2014-04-03 35 views
0

我刚刚从MVC 4升级到5,并开始使用属性路由。 它工作完美,易于实施。MVC属性路由,重定向旧网址

但是,由于网站已经连续数月没有链接到网站,包括搜索引擎。 旧的网址无效,因此我需要永久重定向它们。 我不确定最好的方法是什么。我认为如果我在route.config中创建了一个路由,它将作为路由属性的备份工作。但它似乎只是一个有效的(第一次服务)。

例.. 旧的URL:/银行/ 5 新的URL:/ superbank/5

属性路线是这样的:

[Route("superbank/{id}")] 

而且route.config:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.LowercaseUrls = true; 

routes.MapMvcAttributeRoutes(); 

routes.MapRoute(
      "BankDetails", 
      "bank/{id}", 
      new { controller = "Home", action = "bank" }, //the action is still called bank, not superbank 
      new { id = @"^\d+$" } 
); 

使用此代码,只有超级银行/ 5将工作,而不是银行/ 5 如果我将MapMvcAttributeRoutes()放在MapRoute之下,那么您的ur ls将工作,项目中的所有URL将被创建并指向bank/5。

任何想法? 我应该使用global.asax还是IIS url重写?

回答

0

确定。我想出了一个解决方案。它可能不是最好的,但它的工作原理。

在RouteConfig.cs中,我添加了一个“catchall”路由。现在看起来是这样的:

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.LowercaseUrls = true; 

     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      "", 
      "{catchall*}", 
      new { controller = "Home", action = "NotFound" } 
     ); 

     routes.MapRoute(
      "BankDetails", 
      "bank/{id}", 
      new { controller = "Home", action = "bank" }, 
      new { id = @"^\d+$" } 
     ); 

然后我在我的主页添加控制器的动作NOTFOUND:

public ActionResult NotFound() 
    { 
     string url = Request.Url.ToString(); 
     url = url.Replace("/bank/", "/superbank/"); 
     url = url.Replace("old-page-name", "new-page-name"); //Just to demonstrate 

     if (url != Request.Url.ToString()) 
      return RedirectPermanent(url); 
     else 
      return Redirect("404page"); 
    } 

这工作得很好。你只需要小心,不要更换太通用的名称。

0

如果你只有一个路线(与id参数)重定向,我只想创造一个操作方法,并采取重定向有照顾:

[Route("bank/{id}")] 
public ActionResult Bank(int id) 
{ 
    return RedirectToActionPermanent("superbank", new { id }); 
} 
+0

我不想重命名该操作,也无法创建两个操作,一个操作为路由银行/ {id},另一个操作为超级银行/ {id}。而且这不仅仅是一个动作,它总共大概有30个:) – Andreas