Angular $ locationProvider与ASP.NET MVC路由

时间:2014-05-01 18:20:38

标签: javascript asp.net-mvc angularjs asp.net-mvc-5

我正在使用ASP.NET MVC处理路由(使用RouteCollection类)。但我的前端是用角度写的,在某些地方我想用Angular的$ location更改url,我希望它支持HTML5,所以我把这行添加到我的module.config:

$locationProvider.html5Mode(true);

但从那时起,我的路由似乎已由Angular处理。

例如我的SPA在mysite.com/user上,我希望使用Angular的$ location更改网址(例如,当用户点击标签网址更改为mysite.com/user/tab而不重新加载时)。

但是当用户从该页面导航到任何其他页面(例如mysite.com/other)时,我希望由ASP.NET MVC的路由处理。

现在发生的是我的网址更改为mysite.com/other,但网站未导航到该网页,即MVC路由无法处理更改。

修改

我没有在Angular中定义任何路由,我添加$locationProvider.html5Mode(true);

后,我的所有路由都在服务器端定义,服务器端路由刚刚工作。

2 个答案:

答案 0 :(得分:2)

不幸的是没有。如果您的角度SPA在foo.com上托管并启用了HTML 5模式,foo.com/spaRoute1将会点击您的ASP.Net服务器,并期望找到该路线(可能是控制器= SpaRoute1动作=索引)。

您需要将默认路线设置为始终解析为负责提供SPA的控制器/操作。同时定义您需要的任何其他路线,这些路线并非特定于您的SPA。

答案 1 :(得分:0)

我对ASP.Net不太了解。但是我用这样的节点j解决了同样的问题。

我解决了使用push API启用服务器的同样问题。基本上角度在客户端呈现页面并通过#找到确切的路线。您可以启用html5模式删除#

  $locationProvider.html5Mode({
    enabled:true,
    requireBase: false
});
  

请记住,不要忘记在服务器端启用推送API支持。只需添加

    //To suport push API 
    // Just for DEMO in your case it may be different
app.use('/admin/*', function(req,res){
  var user = req.session.user;
   res.render("adminView",{user:user});
});

这里当您在没有#tag的情况下硬刷新或直接输入浏览器。服务器将呈现主页(索引)页面并加载您所需的所有文件。之后,angular将为您处理所有路由,因为您已启用html5模式,因此不再需要在URL中添加#。