2016-09-12 4 views
1

Я немного запутался в использовании маршрутизации Angular в приложении ASP.NET MVC.Как определить угловую маршрутизацию в ASP.NET MVC

Чтобы понять мой вопрос я показал в настоящее время код моего приложения:

Index.cshtml:

<head> 
    ... 
    @Styles.Render("~/Content/css") 
    @Scripts.Render("~/bundles/modernizr") 
    @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/bootstrap") 
</head> 
<body> 
    <div class="navbar navbar-default navbar-fixed-top"> 
     <div class="container"> 
      <div class="navbar-collapse collapse glyphicons pull-right"> 
       <ul class="nav navbar-nav"> 
        <li ng-class="{active:isActive == '/test1'}"> 
         <a href="#/test1">Test1</a> 
        </li> 
        <li ng-class="{active:isActive == '/test2'}"> 
         <a href="#/test2">Test2</a> 
        </li> 
       </ul> 
      </div> 
     </div> 
    </div> 
    <div class="container body-content"> 
     <div ng-view></div> 
    </div> 

    @Scripts.Render("~/bundles/angular") 
    @Scripts.Render("~/bundles/app") 
</body> 

HomeController (ASP.NET):

namespace Tests.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return PartialView(); 
     } 

     public ActionResult Test1() 
     { 
      return PartialView(); 
     } 

     public ActionResult Test2() 
     { 
      return PartialView(); 
     } 
    } 
} 

Мой угловой модуль:

angular 
    .module('Tests', [ 
     'ngRoute' 
    ]) 
    .config(config) 
    .run(['$rootScope', '$route', '$location', function($rootScope, $route, $location) { 
     $rootScope.$on('$routeChangeSuccess', function(event, currRoute, prevRoute) { 
     $rootScope.title = $route.current.title; 
     }); 

     var path = function() { 
     return $location.path(); 
     }; 

     $rootScope.$watch(path, function(newPath, oldPath) { 
     $rootScope.isActive = newPath; 
     }); 
    }]); 

config.$inject = ['$routeProvider']; 

function config($routeProvider) { 
    $routeProvider 
     .when('/test1', { 
     templateUrl: '/Home/Test1', 
     isActive: 'test1' 
     }) 
     .when('/test2', { 
     templateUrl: '/Home/Test2', 
     isActive: 'test2' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 
} 

Выход URL отображается следующим образом: localhost/Home/Index#/test1

Вопрос:

мне нужно определить действия в HomeController и почему? Я думал, что мне нужен только индекс ActionResult, потому что я использую PartialView() ... И как я могу достичь следующего URL-адреса: localhost/test1, когда я нажимаю на Test1 меню?

+0

см. Мой ответ ниже, пожалуйста, дайте мне знать, если это имеет смысл для вас. Если вы не поправитесь, у меня есть небольшая частная репозитория git, с которой я могу поделиться, но сначала мне нужно анонимизировать ее. –

+0

читайте это http://stackoverflow.com/questions/20801780/angular-ng-include-cshtml-page – Pravin

+0

для угловой маршрутизации + маршрутизация MVC см. Пример. https://angularjsaz.blogspot.in/2015/10/angularjs-routing-aspnet-mvc-example.html – Pravin

ответ

3

В дополнение к тому, что @Andiih заявил в своем ответе. Библиотека маршрутизации Angular предназначена для обработки ваших маршрутов Angular E.G. между (из-за отсутствия лучшего срока) передняя часть контроллеры.

Кажется, что у вас смешанные Angular и ASP.NET MVC маршрутизации в том виде, в котором вы ожидаете, что 2 на работу. Ваш базовый маршрут - localhost/Home/Index# с этого момента. Angular присоединяет свои (под) маршруты к базе URL, в результате чего вы получаете результат URL.

Несмотря на то, что при необходимости можно было бы прыгать между MVC и Angular маршрутами и контроллерами, это был бы более сложный сценарий, чем я предполагаю, что вы стремитесь достичь. Кроме того, мне никогда не приходилось идти в такой степени в прошлом.

В общем, что бы в настоящее время происходит:

Если бы вы уйдете со страницы Index.cshtml «Root» вы фактически перемещаться от вашего текущего Angular приложения .. или перемещаться к в другое приложение ... в зависимости от структуры решения вы могли бы даже использовать разные рамки JavaScript MV * для каждой отдельной страницы ... но это просто безумие.

Current App

... но я сомневаюсь, что это то, что вы хотите, на данном этапе, поэтому для простоты позволяет придерживаться если у вас есть только один ASP.Net MVC Route/Страница, и вы просто хотите просто перемещаться между Angular маршрутов и данных о доставке до Angular маршрутов или страниц с вашего заднего конца .NET услуг как-то.

enter image description here

Таким образом, кажется, что вы могли бы быть потенциально отсутствует связь между тем, что роль каждого из рамок предназначены для воспроизведения в стеке вы в настоящее время. (Я попытаюсь прояснить)

Например:

Если вы посмотрите на (очень общую) общую структуру решения, которые могли бы выглядеть примерно так далее.

- css 
     - bootstrap.css  // all 3rd party css here 
    - libs 
     - angular.js   // all 3rd party js libs here 
     - angular-ui-router.js 
    - controllers 
     - RootController.cs // This is your HomeController. 
           // It's effectively used to "deliver" the root view which is 
           // your core/base page for lack of a better term 
    - views 
     - RootView.cshtml  // see code RootView.cshtml below, 
           // this defines your app "layout" 
           // as well as where you deliver your bundles, 
           // make use of server side auth, etc.. 
    - webapi 
     - test1Api.cs   // access to test1 data or serverside process 
     - test2Api.cs   // etc.. 
    - app 
     - pages 
      - home     
      - test1 
      - test1Ctrl.js 
      - test1View.html 
      - test1.css 
      - test2 
      - test2Ctrl.js 
      - test2View.html 
      - test2.css 
     - services 
     - someRandomSvc.js  
     - resourceSvc.js // this is where you consume your 
          // .NET back end API. E.G: test1Api & test2Api, etc.. 
     - app.js 
     - app.routes.js 
     - etc... 

RootView.cshtml получает построен на стороне сервера, что позволяет использовать .NET bundling, Asp.NET Auth и т.д .. Во всяком случае, вся эта страница будет выступать в качестве оболочки для Angular приложения, весь «передний конец приложения», таким образом, выполняется в контексте этой страницы.

RootView.cshtml

<head> 
    @Styles.Render("~/content/3rdPartyCSS") 
    @Styles.Render("~/content/appSpecificCSS") 
</head> 
<body> 
    <div class="navbar navbar-default navbar-fixed-top"> 
    <div class="container"> 
     <div class="navbar-collapse collapse glyphicons pull-right"> 
      <ul class="nav navbar-nav"> 
       <li><a ui-sref="home">Home</a></li> 
       <li><a ui-sref="test1">Test1</a></li> 
       <li><a ui-sref="test2">Test2</a></li> 
      </ul> 
     </div> 
    </div> 
    </div> 
    <div class="container body-content"> 
     <div ng-view></div> 
    </div> 

    @Scripts.Render("~/bundles/3rdPartyJS") 
    @Scripts.Render("~/bundles/appSpecificJS") 
</body> 

Вам нужно будет только один ASP.Net MVC Route, как я уже сказал ранее, не будет навигации от него (для этого приложения по-крайней мере)

RootController.cs

namespace Tests.Controllers 
{ 
    public class RootController : Controller 
    { 
     public ActionResult RootView() 
     { 
      // as I've mentioned previously in another post, 
      // we're returning a partial to avoid the usage of _layout.cshtml 
      // as our RootView is acting as the layout in for the angular app.   
      // (it would introduce another level of not needed nesting) 
      return PartialView(); 
     } 
    } 
} 

... но вы будете нуждаться множественным Angular маршруты.

app.routes.js

var app = angular.module('Tests'); 
app.config(['$stateprovider', function($stateprovider) {  
    $stateprovider 
    .state('home', { url: '', templateUrl: 'app/pages/home/homeView.html' }]) 
    .state('test1', { url: '/test1', templateUrl: 'app/pages/test1/test1View.html'}) 
    .state('test2', { url: '/test2', templateUrl: 'app/pages/test2/test2View.html'});  
}]); 

Вы бы тогда выставить другой стороне сервера логики или вызовы через WebAPI конечных точек, которые вам нужно будет потреблять через что-то вроде ngResource, который вы затем использовать в ваши контроллеры Angular.

testXView.html

<div ng-controller="testXCtrl as test">{{ test.something }}</div> 

testXCtrl.JS

var app = angular.module('Test'); 
app.controller('testXCtrl',['resourceSvc', function(resourceSvc) { 
    resourceSvc.getSomeData().then(function(data) { 
     this.something = data; //.. or whatever floats your boat :P 
    }) 
}]); 

Примечание.

  1. Используя эту конвенцию с угловым .something(['service', function(service) { }]);, чтобы сделать код min safe. (Так что не бойтесь, когда вы это видите)
  2. В моем примере я использовал библиотеку маршрутизации под названием angular-ui-router, я предлагаю вам взглянуть на нее, если у вас есть свобода выбора на этом этапе ... но те же принципы будут применяться к решению ngRoute.
+1

Да, я полностью согласен с этим решением, если вы хотите простое решение вашей проблемы. –

+1

@ DatzMe спасибо. Если у вас есть предложения или улучшения, пожалуйста, дайте мне знать. :) Я принимаю не ваш голос, но мне интересно, почему я его получил:/itmayormaynothavehurtmyegoalittle –

+0

Я действительно не знаю, почему вы голосуете без объяснения причин. Но я думаю, насколько я знаю, у вас есть смысл решить эту проблему. То, как я использую угловой в MVC, аналогично тому, что вы делали. Может быть, тот, кто голосует, получил лучшее решение :) –

0

Похоже, вы пытаетесь получить MVC для разрешения URL-адресов шаблонов как частичных. Если это так, то вы не можете использовать тот же маршрут как для маршрута MVC, так и для Углового маршрута.

Чтобы разорвать этот вниз на шаги

1) Вы должны MVC разрешить маршруты шаблона (т.е. имеет динамически генерируемые шаблоны) Если вы делаете, сделать контроллер шаблона и построить каждый из ваших шаблонов в качестве частичных действий на контроллере шаблона. Если вам не нужны динамические шаблоны, просто сохраните свои шаблоны как статические HTML в папке, например/Content/Templates, - которая позволяет избежать конвейера MVC.

2) Если вы получаете 1) правильно, у вас должен быть рабочий пример, но с # маршрутами. Чтобы получить маршруты HTML5, вам необходимо исключить эти маршруты из конвейера MVC - routes.IgnoreRoute («/ Index/*»); в RouteConfig.cs может работать - я этого не пробовал.

+0

Спасибо за ваш ответ. Я хотел бы использовать маршрутизацию HTML5 Angular. Но почему-то маршрутизация не работает должным образом. – yuro

+1

Хорошо сказал. У меня создается впечатление, что OP нуждается в небольшой ясности в отношении каждой из схем маршрутизации «угловая маршрутизация»/«чистая маршрутизация» (также кто-то, похоже, пошел на понижение голосов, когда я тоже отвечаю, так что не мой нисходящий голос) –

Смежные вопросы