【发布时间】: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