2016-11-22 55 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

相关问题