带两个MVC控制器的SPA

时间:2013-06-11 19:51:04

标签: asp.net-mvc-4 knockout.js single-page-application durandal sammy.js

按照John Papa的课程,我正在建立一个SPA,并试图确保用户只有在Facebook / Google +身份验证后才能进入SPA。为此,我有两个MCV控制器,默认和着陆控制器称为Home / Index,这只显示带有FB / G +登录按钮的介绍屏幕。一旦使用,单击其中一个按钮并验证用户然后被带到第二个控制器,该控制器是实际的SPA页面,并且div具有id = applicationHost以及shell加载和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')

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

它尝试加载的网址就像'localhost:XXXX / Home / '

结果我从Sammy那里得到了404错误。

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

如何让路由器在SPA MVC控制器而不是'Home'控制器中查找路由'snap'和'place'。

所有这些我只是为了确保在让他们进入SPA之前让人们通过身份验证,所以如果有一种方法可以在其中一个SPA视图中进行身份验证,那么我基本上避免了这个问题。如果上面的问题没有答案,至少如果有人可以说明如何在SPA视图中进行用户身份验证,那也很好。

提前致谢

1 个答案:

答案 0 :(得分:2)

一种解决方法是将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>

然后..使用Authorize属性装饰您的SPA控制器。所有未经身份验证的SPA控制器请求都将被重定向到loginUrl,loginUrl指向您的Landing Controller