asp.net-mvc - 如何在混合的 MVC 和 Web 窗体上路由网页

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

我创建了一个混合 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

这可能吗?

任何建议将不胜感激。

最佳答案

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

关于asp.net-mvc - 如何在混合的 MVC 和 Web 窗体上路由网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21887900/

相关文章:

c# - ASP.NET MVC4 动态表单生成

c# - 使用 AttributeRouting 在 URL 中隐藏区域

asp.net-mvc - 路由测试 ASP.NET MVC4

asp.net-mvc - 在自定义 ASP MVC 路由中为 URL 起别名

asp.net-mvc - 如何在 ASP.NET MVC 中不转义 URL 参数?

c# - 如何验证 mvc 模型中列表中的项目数

javascript - dropzone.js 文件上传超出最大请求长度

.net - 如何在 ASP.NET MVC 中将 View 模型转换为 JSON 对象?

asp.net-mvc - 在我的 asp.net mvc 4 和 MVC5 Web 应用程序中使用 ELMAH

c# - 为什么我的 Entity Framework 代码不首先 DbContext 显示我填充的表中的实体?