【问题标题】:Can't handle routing correctly in mixed VS environment无法在混合 VS 环境中正确处理路由
【发布时间】:2015-07-03 19:05:30
【问题描述】:

我正在使用 SPA 模板在 Visual Studio 中创建一个新项目。我的目标是拥有一个 Angular/SPA 应用程序,它将“托管”/包含一些最终将被现代化/迁移的遗留应用程序。因此,我的 SPA 应用程序的页面上有一个 iframe,当单击菜单项时,我想在该 iframe 中加载一个旧版 ASP.NET 应用程序(它必须在 iframe 中,作为旧版站点使用它们,并且其架构依赖于它们)。 我无法正确路由。 SPA 模板定义了一个这样的 DefaultRoute 类(我将 RouteExistingFiles 更改为 true):

    public class DefaultRoute : Route
{
    public DefaultRoute()
        : base("{*path}", new DefaultRouteHandler()) {
        this.RouteExistingFiles = true;
    }
}

我已经编辑了 RouteConfig.cs 文件以忽略“aspx”页面请求,如下所示:

    public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes) {
        routes.Ignore("*.aspx");
        routes.Add("Default", new DefaultRoute());
    }
}

定义的默认路由处理程序如下所示:

   public class DefaultRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext) {
        // Use cases:
        //     ~/            -> ~/views/index.cshtml
        //     ~/about       -> ~/views/about.cshtml or ~/views/about/index.cshtml
        //     ~/views/about -> ~/views/about.cshtml
        //     ~/xxx         -> ~/views/404.cshtml
        var filePath = requestContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;

        if (filePath == "~/") {
            filePath = "~/views/index.cshtml";
        }
        else {
            if (!filePath.StartsWith("~/views/", StringComparison.OrdinalIgnoreCase)) {
                filePath = filePath.Insert(2, "views/");
            }

            if (!filePath.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase)) {
                filePath = filePath += ".cshtml";
            }
        }

        var handler = WebPageHttpHandler.CreateFromVirtualPath(filePath); // returns NULL if .cshtml file wasn't found

        if (handler == null) {
            requestContext.RouteData.DataTokens.Add("templateUrl", "/views/404");
            handler = WebPageHttpHandler.CreateFromVirtualPath("~/views/404.cshtml");
        }
        else {
            requestContext.RouteData.DataTokens.Add("templateUrl", filePath.Substring(1, filePath.Length - 8));
        }

        return handler;
    }
}

目录结构是这样的:

我的SPA

  • SPA

  • Legacy

在 IIS 中,我将旧文件夹设置为 SPA 应用程序中的虚拟目录(子目录)。

如何设置路由,以便在单击菜单项并为 .aspx 页面发送请求(包含具有查询字符串信息的 url)时,可以将请求路由到旧应用程序?

【问题讨论】:

    标签: asp.net visual-studio-2013 single-page-application


    【解决方案1】:

    我已经解决了这个问题。这个问题是由几个问题引起的。但是,与我上面的信息最相关的问题是……我需要找到正确的方法来忽略新站点的路由代码中对旧 aspx 页面的请求。因此,在 RouteConfig.cs 文件中,我将这条忽略语句放在了 RegisterRoute 函数的第一行:

    routes.Ignore("{*allaspx}", new { allaspx =  @".*\.aspx(/.*)?"});
    

    这纠正了主要问题,还有其他一些小问题使情况混乱,但是,我已经确定了它们是什么,我正在努力解决这些问题。因此,在路由功能中忽略遗留 url 是正确的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2019-04-05
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多