AngularJS可选的URL参数与HTML5模式和ASP.Net MVC

问题描述:

类似于我问的最后一个问题,但有点复杂。AngularJS可选的URL参数与HTML5模式和ASP.Net MVC

我有一个ASP.Net MVC服务Angular应用程序。

.when("/Catalog", 
{ 
    templateUrl: "/htm/catalog/catalog.htm" 
}) 
.when("/Catalog/:Category1", 
{ 
    templateUrl: "/htm/catalog/search.htm" 
}) 
.when("/Catalog/:Category1/:Category2", 
{ 
    templateUrl: "/htm/catalog/search.htm" 
}) 
.when("/Catalog/:Category1/:Category2/:Category3", 
{ 
    templateUrl: "/htm/catalog/search.htm" 
}) 
.when("/Catalog/:Category1/:Category2/:Category3/:Category4", 
{ 
    templateUrl: "/htm/catalog/search.htm" 
}); 

$ locationProvider.html5Mode(真);

和MVC路由看起来是这样的:

// AngularJS Route. This is what allows angular to handle its own routing. 
routes.MapRoute(
    "hash", 
    "#/{whatever}/{param}/{param2}/{param3}/{param4}/{param5}", 
    new 
    { 
     controller = "Home", 
     action = "Index", 
     param = UrlParameter.Optional, 
     param2 = UrlParameter.Optional, 
     param3 = UrlParameter.Optional, 
     param4 = UrlParameter.Optional, 
     param5 = UrlParameter.Optional 
    } 
); 

// This catches all of the other requests (e.g. /img/logo.jpg); 
routes.MapRoute(
    "whatever", 
    "{whatever}/{param}", 
    new 
    { 
     controller = "Home", 
     action = "Index", 
     param = UrlParameter.Optional, 
     param2 = UrlParameter.Optional, 
     param3 = UrlParameter.Optional, 
     param4 = UrlParameter.Optional, 
     param5 = UrlParameter.Optional 
    } 
); 

家庭/ index动作只是返回我的索引页:

public void Index() 
{ 
    String html = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/htm/index.htm")); 
    HttpContext.Response.Write(html); 
} 

说我遇到的问题是,当我试着打其中一个具有可选参数的路由,页面挂起,给出此javascript错误:

错误:已达到10次$ digest()迭代。中止!

有时它会无休止地呈现自己(就像镜子照镜子一样),这使我认为“无论”路径是否会导致问题。如果没有这些可选参数,路由将完全失败。通过这种方式,页面可以渲染并将参数加载到$ routeParams中,但页面会挂起,大概是因为它正在递归呈现。

如果我取出“whatever”MVC路由上的可选参数并尝试用散列符号(/#/ Catalog/test)命中路由,它会加载得很好(它不会挂起,路由参数在那里),但html5版本(/ Catalog/test)无法找到MVC路由。

很明显,我的问题是与我的路由,但我不知道我做错了什么。有人可以解释为什么问题可能是什么?

不确定这会有所帮助。但要记住一些事情。

  • $locationProvider.html5Mode(true);散列将仅由传统的浏览器中使用(IE < = 9)
  • URL的哈希部分将不会被发送到服务器。所以你不需要routes.MapRoute作为散列
  • 当浏览器请求一个URI(即/目录/测试)时,它将首先点击ASP.NET路由,然后,当页面被加载时,它将被处理AngularJS
  • 它还看起来像routes.MapRoute处理程序“无所谓”重新发送整个页面,这意味着当角试图处理的路径,并尝试加载/htm/catalog/search.htm的ASP.NET路由将再次成为了网页。这会导致无限循环,因为由angular.js加载的页面包含它自己,并且它会尝试再次加载它。

希望它有帮助。