經過一段時間的實驗. 在別的framework找到可以讓backend的route支援angular html5mode了.
基本方式是如果我路由規則沒有定義的,全部指向index頁面(有ng-view的)
所以基於這個原則. mvc的路由規則就要稍微調整一下.
將原本的DefaultApp修改一下
1 2 3 4 5 6 7 8 9 10 11 12 // 舊 routes.MapRoute( name: "DefaultApp", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); // 新 routes.MapRoute( name: "DefaultApp", url: "app/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
然後新增
1 routes.Add(new SingleRoute());
SingleRoute Class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class SingleRoute : RouteBase { public override RouteData GetRouteData(HttpContextBase httpContext) { var data = new RouteData(this, new MvcRouteHandler()); data.Values.Add("controller", "Home"); data.Values.Add("action", "Index"); return data; } public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { return null; } }
Client angular side:
1 2 3 4 5 6 7 $stateProvider .state('state1', { url: "/state1", templateUrl: "app/Home/state1" <= mvc route rule }) $locationProvider.html5Mode(true).hashPrefix('!')
以上