【问题标题】:How to route web pages on a mixed MVC and Web Forms如何在混合的 MVC 和 Web 窗体上路由网页
【发布时间】:2014-02-19 17:28:40
【问题描述】:

我创建了一个混合 MVC 和 Web 窗体的网站 - 使用后来的 Visual Studio 2013 工具很容易做到。一切正常,我可以正确导航到 MVC 和 Web 表单页面。

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

/
 + Content
 + Controllers
 + Models
 + Scripts
 + Views
 + WebPages
    + Default.aspx
    + MyWebForm.aspx

所以我希望能够访问:

/WebPages/Default.aspx   as /Default.aspx or even just /
/WebPages/MyWebForm.aspx as /MyWebForm.aspx

这可能吗?

任何建议将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    作为一个起点,我们可以在 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 }
            );
        }
    }
    

    编辑

    经过一番研究,我找到了您正在寻找的东西。 我创建了一个有用的自定义 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);
        }
    }
    

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

    url "~/somepage.aspx" 将被映射到 "~/WebForms/somepage.aspx"

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

    url "~/forms/somepage" 将被映射到 "~/WebForms/somepage.aspx"

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

    【讨论】:

    • 非常感谢 - 这是完美的。
    猜你喜欢
    • 2012-02-09
    • 2018-08-17
    • 2016-04-26
    • 2011-11-16
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多