SPA с двумя контроллерами MVC

Следуя курсу Джона Папы, я создаю SPA и пытаюсь убедиться, что пользователи попадают в SPA только после аутентификации Facebook/Google+. Для этого у меня есть два контроллера MCV, по умолчанию и посадочный контроллер называется Home/Index, и он отображает только вводный экран с кнопками входа FB/G+. После использования нажмите одну из кнопок и аутентифицируйте пользователей, а затем перенесите их на второй контроллер, который является фактической страницей SPA и имеет div с id = applicationHost и где загружается оболочка и начинается SPA.

Я использую следующий массив маршрутов JSON для отображения своих маршрутов

var routes = [{
               url: 'snaps', 
               moduleId: 'viewmodels/snaps', 
               name: 'Snaps', 
               visible: true
              },{
               url: 'places', 
               moduleId: 'viewmodels/places', 
               name: 'Places', 
               visible: true
             }];

Но когда я вызываю router.map(config.routes), за которым следует router.activate('snaps')

роутер ищет маршрут snaps в корне всего приложения

URL-адрес, который он пытается загрузить, выглядит как «localhost:XXXX/Home/#»

В результате я получаю ошибку 404 от Sammy.

Когда я загружаю вручную, перейдите на «localhost: XXXX/SPA/Snaps/#», я получаю представление без проблем.

Как я могу заставить маршрутизатор искать маршруты «привязка» и «место» в контроллере SPA MVC, а не в «домашнем» контроллере.

Все это я делаю только для того, чтобы удостовериться, что я аутентифицирую людей, прежде чем разрешить им доступ в SPA, поэтому, если есть способ выполнить аутентификацию в одном из представлений SPA, я по существу избежал этой проблемы. Если нет ответа на мой вопрос выше, по крайней мере, если кто-то может пролить свет на то, как я могу выполнить аутентификацию пользователя в представлении SPA, это тоже будет здорово.

заранее спасибо


person indichimp    schedule 11.06.2013    source источник
comment
Что касается второго контроллера - вы имеете в виду полное обновление страницы, верно? ИМХО (поскольку я это реализовал) логин должен быть частью самого приложения SPA, так что это одно из представлений. Некоторые моменты: 1.) Создайте веб-API для процедуры входа в систему, вызываемой через ajax. 2.) Украсьте свои классы контроллеров с помощью Authorize. Таким образом, никакие несанкционированные вызовы не будут успешными.   -  person alpinescrambler    schedule 12.06.2013
comment
@alpinescrambler спасибо за ваш ответ, да, я полностью обновляю страницу, но это только в первый раз (во время входа в систему). Я сделал это так, потому что не мог понять, как выполнить аутентификацию Facebook в представлении SPA. Не могли бы вы подробнее остановиться на пункте №? 1 в вашем комментарии? Не могли бы вы пролить больше света на то, как я могу использовать внешний OAuth с помощью webAPI. Еще раз спасибо.   -  person indichimp    schedule 12.06.2013


Ответы (1)


Одним из обходных путей является установка контроллера SPA в качестве контроллера по умолчанию. Что-то в этом роде:

System.Web.Routing.RouteTable.Routes.MapRoute(
          name: "SPA",
          url: "{controller}/{action}/{id}",
          defaults: new
          {
              controller = "SPA",
              action = "Index",
              id = UrlParameter.Optional
          }
      );

Убедитесь, что это первый сопоставленный маршрут MVC.

Затем... В вашем web.config вы можете установить loginUrl для Landing Controller.

<authentication mode="Forms">
  <forms loginUrl="~/Home/Index" timeout="2880" />
</authentication>

Затем... Украсьте свой SPA-контроллер атрибутом Authorize. Все неаутентифицированные запросы к SPA-контроллеру будут перенаправлены на loginUrl, который указывает на ваш Landing Controller.

person Jacques Snyman    schedule 12.06.2013
comment
Спасибо за вашу помощь, я попробую это и вернусь. - person indichimp; 12.06.2013
comment
Спасибо, очень помогло, ценю. - person indichimp; 13.06.2013