2013-04-04 54 views
4

類似於我問的最後一個問題,但有點複雜。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路由。

很明顯,我的問題是與我的路由,但我不知道我做錯了什麼。有人可以解釋爲什麼問題可能是什麼?

回答

0

不確定這會有所幫助。但要記住一些事情。

  • $locationProvider.html5Mode(true);散列將僅由傳統的瀏覽器中使用(IE < = 9)
  • URL的哈希部分將不會被髮送到服務器。所以你不需要routes.MapRoute作爲散列
  • 當瀏覽器請求一個URI(即/目錄/測試)時,它將首先點擊ASP.NET路由,然後,當頁面被加載時,它將被處理AngularJS
  • 它還看起來像routes.MapRoute處理程序「無所謂」重新發送整個頁面,這意味着當角試圖處理的路徑,並嘗試加載/htm/catalog/search.htm的ASP.NET路由將再次成爲了網頁。這會導致無限循環,因爲由angular.js加載的頁面包含它自己,並且它會嘗試再次加載它。

希望它有幫助。