.net MVC属性路由,重定向旧URL

.net MVC属性路由,重定向旧URL,.net,asp.net-mvc,asp.net-mvc-5,.net,Asp.net Mvc,Asp.net Mvc 5,我刚刚从MVC4升级到5,并开始使用属性路由。 它工作完美,易于实现 但是,由于该网站已经开通了几个月,有很多链接到该网站,包括来自搜索引擎的链接。 旧的URL将无法工作,因此我需要永久重定向它们。 我不确定最好的办法是什么。我认为,如果我在route.config中创建了一个路由,它将作为routing属性的备份。但这似乎是唯一一个先到先得的方法 例如。。 旧网址:/bank/5 新网址:/superbank/5 属性路由如下所示: [Route("superbank/{id}")] 以及r

我刚刚从MVC4升级到5,并开始使用属性路由。 它工作完美,易于实现

但是,由于该网站已经开通了几个月,有很多链接到该网站,包括来自搜索引擎的链接。 旧的URL将无法工作,因此我需要永久重定向它们。 我不确定最好的办法是什么。我认为,如果我在route.config中创建了一个路由,它将作为routing属性的备份。但这似乎是唯一一个先到先得的方法

例如。。 旧网址:/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 如果我将mapmvCatTributerRoutes放在MapRoute下面,两个URL都不会工作,项目中的所有URL都将被创建并指向bank/5

有什么想法吗?
我应该使用global.asax还是IIS url rewrite?

如果您只有一条带有id参数的路由要重定向,我只需要创建一个操作方法并在那里处理重定向:

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

嗯。我想出了一个解决办法。它可能不是最好的,但它很有效

在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+$" } 
        );
然后,我添加了一个在我的家庭控制器中找不到的操作:

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

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

我不想重命名该操作,也不能创建两个操作,一个使用route bank/{id},另一个使用superbank/{id}。这里不仅有一个动作,总共大约有30个动作: