我刚刚从MVC 4升级到5并开始使用属性路由。 它工作完美,易于实现。
但是,由于该网站已经持续了几个月,因此网站上有许多链接,包括搜索引擎。 旧网址无法正常工作,因此我需要永久重定向它们。 我不确定最好的方法是什么。我想如果我在route.config中创建了一个路由,这将作为路由属性的备份。但似乎只有一个有效(先服务)。
实施例.. 旧网址:/ bank / 5 新网址:/ 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+$" }
);
使用此代码,只有superbank / 5可以使用,而不是bank / 5 如果我将MapMvcAttributeRoutes()放在MapRoute下面,那么这两个url都不起作用,并且将创建项目中的所有url并指向bank / 5.
有什么想法吗? 我应该使用global.asax还是IIS url重写?
答案 0 :(得分:0)
如果你只有一条路线(带有id
参数)来重定向,我只想创建一个动作方法,并在那里处理重定向:
[Route("bank/{id}")]
public ActionResult Bank(int id)
{
return RedirectToActionPermanent("superbank", new { id });
}
答案 1 :(得分: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");
}
这很好用。您只需要小心不要替换过于通用的名称。