2016-11-22 52 views
0

所以我正在研究一個現有的MVC應用程序,並且前幾天我們添加了一個角度模塊。我們嘗試使用ajax加載它,但角度拒絕加載,所以我們決定在索引中添加角度路由和ng-view。問題是隻有角路由正在工作,MVC路由死了。我是否需要將它們逐一添加到$routeProvider,這會導致大量不必要的工作?我們也嘗試用2進行測試,當c#控制器返回View()時,它不會在特定的ng-view div中加載,只是將部分加載爲整頁。是否可以讓角處理一些路線和mvc他人?

這是我的實際路徑配置:

$routeProvider 
     .when('/', { 
      templateUrl: '/ServiceDesk/starter' 
     }) 
      //Facturas 
     .when('/app/Facturacion/MantenimientoFacturas', { 
      templateUrl: '/Facturacion/MantenimientoFacturas', 
      controller: 'FacturasController' 
     }) 
      // Ordenes 
      .when('/app/Facturacion/MantenimientoOrdenes', { 
       templateUrl: '/Facturacion/MantenimientoOrdenes', 
       controller: 'OrderController' 
      }); 

     $locationProvider.html5Mode(true); 

我很想角只是爲了管理這個路線和所有其他的MVC管理,是可能的,或者有什麼更好的辦法?

回答

0

由於路線根據順序而優先,所以您只需要明確您的路線在您的MVC路線中的順序。例如,它看起來像

/app/Facturacion/ 

是您希望Angular運行的位置。因此,在你的MVC路線,在RouteConfig

routes.MapRoute(
    name: "ngRoute", 
    url: "app/Facturacion/{*angularRoute}", 
    defaults: new {controller = "Facturacion", action = "Index" } 
); 

所以現在添加爲第一條路線,任何時候你打的路線開始應用/ Facturacion /,棱角分明的路線將接管。否則它將跳過並繼續使用MVC路由。如果有一個特定的MVC路徑使用與angular(/ app/Facturacion /)相同的路徑,請將其添加到RouteConfig中的ngRoute上方,這將繼續運行MVC而不是角度。

routes.MapRoute(
    name: "myMvcRoute", 
    url: "app/Facturacion/someRoute", 
    defaults: new {controller = "Facturacion", action = "SomeAction" } 
); 

確保在您的FacturacionController該指數操作返回查看,並在您查看,添加您的角度腳本和角碼。視圖的例子會是這樣的

@{ 
    ViewBag.Title = "Facturacion"; 
} 
@section head{ 
    <base href="/"> //Add a head section in your layout (make it optional) 
} 
@section scripts{ 
    @Scripts.Render("~/bundles/angularjs") 
    @Scripts.Render("~/bundles/facturacionSPA") 
} 
<div ng-app="facturacionApp"> 
    <div ng-view></div> 
</div> 

你角路線看起來像

$routeProvider.when('/app/Facturacion/MantenimientoFacturas', { 
    templateUrl: '/Facturacion/MantenimientoFacturas', 
    controller: 'FacturasController' 
    }).when('/app/Facturacion/MantenimientoOrdenes', { 
    templateUrl: '/Facturacion/MantenimientoOrdenes', 
    controller: 'OrderController' 
    }).otherwise({ 
    redirectTo: '/ServiceDesk/starter', 
    }); 

此外,角模板應該是普通的HTML文件,而不是局部視圖。更好地堅持角的東西和MVC的mvc東西角,不要混在我看來!

編輯: 如果「/的ServiceDesk /起動器」是一個MVC的路線,你不想角路由到它,你可以做這樣的事情在你的角度控制器:

if ($location.url().indexOf('/ServiceDesk/starter') >= 0 && supports_history_api()) $window.location.href = '/ServiceDesk/starter'; 

代碼supports_history_api()爲完整性,這決定了我是否使用$ locationProvider的html5模式,因爲我需要舊的IE來工作

function supports_history_api() { 
    return !!(window.history && history.pushState); 
} 
+0

謝謝你的回覆!我有這個疑問,如果我映射此路線:routes.MapRoute( name:「myMvcRoute」, url:「app/Facturacion/someRoute」, 默認值:新{controller =「Facturacion」,action =「SomeAction」} );在MVC中,但不是在$ routeProvider中,應用程序從未打過網址;它只會將我重定向到.otherwise,即使我刪除。其他方式,它會重定向到基礎href,它看起來像我強制添加$ routeProvider上的每條路線,我是嗎? – user3542595

+0

是的,角度的應用程序永遠不會打這個網址,我說如果你想運行一個正常的MVC網址,而不是運行角度的應用程序。但是我想從angular角度加載這個url來退出mvc,使用$ window.location.href,不要使用角度$ location(我總是這樣做)。所以要從角度到mvc,使用$ window.location.href = yourMVCroute。要保持角度,請使用$ location。 – garethb

+0

請參閱編輯我的答案 – garethb

相關問題