重新映射asp.net Web应用程序中的文件夹

时间:2017-09-07 20:17:50

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

我正在将asp.net webforms网站类型项目转换为asp.net mvc Web应用程序。我希望将所有更改保持在最低限度。

页面及其子文件夹位于项目文件夹的顶部,有数百个。

现在,在新的Web应用程序中,我想将它们移动到子文件夹,我们称之为WebForms。

运行时是否有办法在之前运行页面时运行,即在应用程序文件夹的根目录下运行?

我之前:http://localhost:54321/Page1.aspx。 Page1.aspx存储在网站项目根文件夹中。

在新项目结构中,我有磁盘:

<project folder>
   WebForms
      Page1.aspx

这有效:http://localhost:54321/WebForms/Page1.aspx,但我想以某种方式将其映射到http://localhost:54321/Page1.aspx

可行吗?我使用IIS Express进行开发,使用IIS 7.5进行测试/生产部署。我想避免更改图像和其他内容网址 - 因为您可以想象将页面移动到子文件夹会破坏其中一些。

由于

1 个答案:

答案 0 :(得分:1)

如果您只想将所有请求映射到/something.aspx,以便转到WebForms\something.aspx,则可以使用以下路由规则。

routes.MapPageRoute(
   "Other Web Pages",
   "{pagename}.aspx",
   "~/WebForms/{pagename}.aspx");

或者,如果您需要更高级的方案,则可以使用派生自RouteBase的自定义类,并使用RegEx匹配并映射路由,类似于this question's answer < / p>

public class WebFormsRoute : RouteBase
{
      Regex re = new Regex(@"^/(?<page>\w+)\.aspx", RegexOptions.IgnoreCase);

      public override RouteData GetRouteData(HttpContextBase httpContext)
      {
         var data = new RouteData();


         var url = httpContext.Request.FilePath;

         if (!re.IsMatch(url))
         {
            return null;
         }

         var m = re.Match(url);

         data.RouteHandler = new PageRouteHandler("~/WebForms/" + m.Groups["page"].Value + ".aspx");

         return data;
      }

}

然后将其添加到RouteConfig

中的路线集中
public class RouteConfig
{
  public static void RegisterRoutes(RouteCollection routes)
  {
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


     routes.Add(new WebFormsRoute());

     routes.MapRoute(
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );
  }

}