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加载的页面包含它自己,并且它会尝试再次加载它。
希望它有帮助。