2014-04-03 34 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