Asp.net mvc 4 带有两个MVC控制器的SPA

Asp.net mvc 4 带有两个MVC控制器的SPA,asp.net-mvc-4,knockout.js,single-page-application,durandal,sammy.js,Asp.net Mvc 4,Knockout.js,Single Page Application,Durandal,Sammy.js,按照约翰·帕帕的课程,我正在建立一个水疗中心,并试图确保用户只有在Facebook/Google+认证后才能进入水疗中心。为此,我有两个MCV控制器,默认控制器和着陆控制器称为Home/Index,这只显示带有FB/G+登录按钮的介绍性屏幕。使用后,单击其中一个按钮并进行身份验证,然后将用户带到第二个控制器,该控制器是实际的SPA页面,具有id=applicationHost的div,shell加载和SPA从这里开始 我使用以下routes JSON数组来映射我的路由 var routes =

按照约翰·帕帕的课程,我正在建立一个水疗中心,并试图确保用户只有在Facebook/Google+认证后才能进入水疗中心。为此,我有两个MCV控制器,默认控制器和着陆控制器称为Home/Index,这只显示带有FB/G+登录按钮的介绍性屏幕。使用后,单击其中一个按钮并进行身份验证,然后将用户带到第二个控制器,该控制器是实际的SPA页面,具有id=applicationHost的div,shell加载和SPA从这里开始

我使用以下routes 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')时

路由器正在整个应用程序的根目录中查找快照路由

它试图加载的url类似于“localhost:XXXX/Home/#”

结果,我从Sammy那里得到了一个404错误

当我手动加载到'localhost:XXXX/SPA/Snaps/#时,我的视图没有问题

如何使路由器在SPA MVC控制器而不是“主”控制器中查找路由“快照”和“位置”

<authentication mode="Forms">
  <forms loginUrl="~/Home/Index" timeout="2880" />
</authentication>
我所做的所有这些只是为了确保在让人们去SPA之前,我让他们进行身份验证,因此,如果有一种方法可以在SPA视图本身中进行身份验证,那么我基本上避免了这个问题。如果我上面的问题没有答案,至少如果有人能告诉我如何在SPA视图中进行用户身份验证,那也太好了


提前感谢

一个解决方法是将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设置为着陆控制器

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


然后。。使用Authorize属性装饰SPA控制器。对SPA控制器的所有未经验证的请求都将重定向到loginUrl,它指向您的着陆控制器

“转到第二个控制器”-您的意思是整页刷新,对吗?IMHO(因为我已经实现了它)“登录”应该是SPA应用程序本身的一部分,因此它是其中一个视图。要点:1.)为登录过程构建Web API,可通过ajax调用。2.)用Authorize装饰控制器类。这样,就不会有未经授权的呼叫成功。@alpinescrambler感谢您的回复,是的,我正在刷新整个页面,但这只是第一次(在登录期间)。我这样做是因为我不知道如何在SPA视图中进行Facebook身份验证。请你详细说明你评论中的第一点好吗?你能告诉我如何使用webAPI实现外部OAuth吗。再次感谢。谢谢你的帮助,我会试试这个然后回来。谢谢你,这真的很有帮助,谢谢你。