带有 System.Web.Routing 的 AngularJS

标签 angularjs routes

这是一个关于 AngularJS 应用程序路由的问题。它不使用 MVC,它使用 WebAPI 作为后端(这些路由工作正常)。

我使用 VS SPA 模板作为基准:http://visualstudiogallery.msdn.microsoft.com/5af151b2-9ed2-4809-bfe8-27566bfe7d83

我遇到的问题是我的 DefaultRouteHandler 似乎总是在我的 Angular 定义的路线之前被击中。例如,我有一个路径为/wageagreement/new,但 .cshtml 文件位于/views/wageagreement/detail 中。我的 Angular 路线在 app.js 中定义如下:

$stateProvider
        .state('wageagreement-new', {
            url: '/wageagreement/new',
            templateUrl: '/views/wageagreement/detail',
            controller: 'wageAgreementDetailsCtrl'
        })

如果我转到页面/wageagreement/new,我的 DefaultRouteHandler(见下文)首先被点击,文件路径是/wageagreement/new。因为这个文件不存在,我得到一个 404 错误返回。然后我的 Angular 路径似乎开始了,页面从/view/wageagreement/detail 加载得很好。因此,对于每一页,我都会收到错误 404 的闪现,然后我会得到正确的页面。有什么办法可以使这项工作?我开始想也许我的 .cshtml 文件必须与我的路线匹配才能使其工作。
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/touranalysis/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;
    }
}

最佳答案

VS SPA 模板 ( http://visualstudiogallery.msdn.microsoft.com/5af151b2-9ed2-4809-bfe8-27566bfe7d83 ) 正在执行双重路由。这还不够。这只是错误的。除了根链接之外,没有任何直接链接起作用。

如果你想使用 Angular 路由,你所要做的就是让 DefaultRouteHandler 类看起来像这样

public class DefaultRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return WebPageHttpHandler.CreateFromVirtualPath("~/views/index.cshtml");
    }
}

基本上将所有内容重新路由到您的 Angular 主页,让 Angular 路由完成这项工作。

关于带有 System.Web.Routing 的 AngularJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21633244/

相关文章:

javascript - UI Bootstrap 选项卡在重新加载后保存事件选项卡

ruby-on-rails - Rails没有路线匹配{:controller= >“devise/products” }

java - 如何使用将加载 JPA 实体的动态 id 属性在 Play Framework v1.2.7 中配置 POST 路由

javascript - 在 Angular 4 的父级中呈现子路由

java - Spring、AngularJS 和 Maven 之间的联系

javascript - 使用 AngularJS 和 ng-submit 记住密码

html - $anchorScroll 效果与鼠标滚动而不是单击 Angular

Laravel:有没有办法将路由组织成层次树

javascript - Vue-router 仅在添加全局导航守卫后抛出 "Cannot read property ' matched' of undefined"错误

javascript - Angular js json.stringify 到 php