如何在混合的MVC和Web窗体上路由网页

Nei*_*ski 3 asp.net-mvc asp.net-mvc-routing asp.net-mvc-4

我创建了一个混合MVC和Web窗体网站-使用更高版本的Visual Studio 2013工具非常容易。一切正常,我可以正确导航到MVC和Web窗体页面。

但是,我想做的是将所有Web表单页面都放在一个特定的子目录中,然后在不使用该子目录的情况下路由到它们。

/
 + Content
 + Controllers
 + Models
 + Scripts
 + Views
 + WebPages
    + Default.aspx
    + MyWebForm.aspx
Run Code Online (Sandbox Code Playgroud)

因此,我希望能够访问:

/WebPages/Default.aspx   as /Default.aspx or even just /
/WebPages/MyWebForm.aspx as /MyWebForm.aspx
Run Code Online (Sandbox Code Playgroud)

这可能吗?

任何意见,将不胜感激。

Jon*_*ora 7

作为起点,我们可以在App_Start / RouteConfig.cs中为Webforms页面添加特定的路由:

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

        //specific page route
        routes.MapPageRoute("forms", "forms", "~/Webforms/RootForm.aspx");

        //specific pattern to a directory
        routes.MapPageRoute("webformsmap", "{page}.aspx", "~/Webforms/{page}.aspx");


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

编辑

经过一番研究,我找到了您想要的东西。我创建了一个有用的自定义IRouteHandler以实现更好的功能。这样,您可以将Webforms * .aspx页面的整个目录映射到一条路由。看看这个:

public class DirectoryRouteHandler : IRouteHandler
{
    private readonly string _virtualDir;

    public DirectoryRouteHandler(string virtualDir)
    {
        _virtualDir = virtualDir;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var routeValues = requestContext.RouteData.Values;

        if (!routeValues.ContainsKey("page")) return null;

        var page = routeValues["page"].ToString();
        if (!page.EndsWith(".aspx"))
            page += ".aspx";
        var pageVirtualPath = string.Format("{0}/{1}", _virtualDir, page);

        return new PageRouteHandler(pageVirtualPath, true).GetHttpHandler(requestContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用DirectoryRouteHandler,您可以很好地实现您的目标。

网址“〜/ somepage.aspx”将被映射到“〜/ WebForms / somepage.aspx”

routes.Add("rootforms", new Route("{page}.aspx", 
    new DirectoryRouteHandler(virtualDir: "~/WebForms")));
Run Code Online (Sandbox Code Playgroud)

网址“〜/ forms / somepage”将映射到“〜/ WebForms / somepage.aspx”

routes.Add("webforms", new Route("forms/{page}", 
    new DirectoryRouteHandler(virtualDir: "~/WebForms")));
Run Code Online (Sandbox Code Playgroud)