Asp.net路由掩盖了路径中的物理文件夹

时间:2011-05-02 23:06:44

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

为了更好地组织我的ASP.Net项目,我将所有.aspx文件放在一个名为WebPages的文件夹中。

我想找到一种方法来屏蔽我的所有网址中的'WebPages'文件夹。例如,我不想使用以下URL:

http://localhost:7896/WebPages/index.aspx
http://localhost:7896/WebPages/Admin/security.aspx

但相反,我希望我的所有网址如下('WebPages'是我用于构建我的工作的物理文件夹,但不应该对外界可见:)

http://localhost:7896/index.aspx
http://localhost:7896/admin/security.aspx

我能够通过为我的项目中的每个页面指定路由条目(并且它可以工作)来提出我自己的解决方案,但是这无法继续维护,我需要另一种方法。

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapPageRoute("", "index.aspx", "~/WebPages/index.aspx");
        routes.MapPageRoute("", "admin/security.aspx", "~/WebPages/Admin/security.aspx");
    }
}

也许我所追求的是一个能够捕获所有请求的类,只需添加我的'WebPages'物理目录?

2 个答案:

答案 0 :(得分:0)

使用http://www.iis.net/download/urlrewrite而不是

你可以在web.config中使用它:

<rewrite>
  <rules>
    <rule name="Rewrite to Webpages folder">
      <match url="(.*)" />
      <action type="Rewrite" url="/WebPages/{R:1}" />
    </rule>
  </rules>
</rewrite>

答案 1 :(得分:0)

我终于推出了以下适用于我的情况的解决方案:

在我的Global.asax文件中,我有以下代码:

public class Global : HttpApplication
{
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Path.EndsWith(".aspx"))
        {
            FixUrlsForPages(Context, Request.RawUrl);
        }
    }

    private void FixUrlsForPages(HttpContext context, string url)
    {
        context.RewritePath("/WebPages" + url);
    }
}

它几乎正在做Tudor所建议的但是在代码而不是web.config(我无法工作)。

相关问题