使用ASP.NET MVC的通配符MapPageRoute支持组织遗留代码

时间:2010-07-27 21:55:13

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

我正在努力将现有的ASP.NET网站迁移到MVC项目中。有几个(60+)页面我还不想重写,所以我想知道我是否有办法:

  • 将现有的.aspx页面(标记和代码隐藏文件)移动到我的MVC结构中的“Legacy”文件夹中
  • 设置路由,以便调用/foo.aspx(不带'legacy')实际调用〜/ Legacy / foo.aspx

实际上,我不希望URL中有“遗留”,但我也不希望MVC解决方案充满遗留的.aspx页面。我接受这是一个非常小的问题,我只是好奇它是否可以通过路由完成。

我意识到我能做到:

routes.MapPageRoute("legacy-foo", "Foo.aspx", "~/Legacy/Foo.aspx"); 

但我想知道是否有办法动态地(使用MVC路线)?例如:

routes.MapPageRoute("legacyroutes", "{filename}.aspx", "~/Legacy/{filename}.aspx"); 

我想一种方法是使用URL重写器模块,但如果路由能够本地执行此操作,那似乎有点多余。

2 个答案:

答案 0 :(得分:1)

不确定你是否仍然需要这个,但你可以用一个肮脏的解决方案来解决这个问题:

使用HttpContext.Current.Request.MapPath("")获取路径的物理位置,然后使用DirectoryInfo/FileInfo类循环遍历所有aspx文件(以及您要映射的任何其他内容)。然后,您可以动态注册文件的备用路径。

我已经完成了一个原型,它似乎正在起作用,当然,魔鬼总是在细节中。

干杯,

答案 1 :(得分:1)

我使用控制器解决了这个问题,该控制器返回文件的内容。它不是一个完美而快速的解决方案,但它有效。

routes.MapRoute(
    "legacyroutes",
    "{filename}.aspx",
    new { controller = "Home", action = "RedirectFile"}
); 

控制器:

public class HomeController : Controller
{
    public ActionResult RedirectFile(string filename)
    {
        string url = Url.Content("~/Legacy/"+filename+".aspx");
        Redirect(url); // or other code to process the file
    }
}

此处的详细信息和其他示例:http://maxivak.com/dynamic-url-rewriting-on-asp-net-mvc/