MVC属性路由,重定向旧URL

时间:2014-04-03 13:56:21

标签: .net asp.net-mvc asp.net-mvc-5

我刚刚从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重写?

2 个答案:

答案 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");
    }

这很好用。您只需要小心不要替换过于通用的名称。