【问题标题】:SPA with two MVC controllers带有两个 MVC 控制器的 SPA
【发布时间】:2013-06-07 19:11:15
【问题描述】:

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

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

它尝试加载的 url 类似于 'localhost:XXXX/Home/#'

因此,我从 Sammy 收到 404 错误。

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

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

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

提前致谢

【问题讨论】:

  • “带到第二个控制器” - 你的意思是整页刷新对吗?恕我直言(因为我已经实现了它)“登录”应该是 SPA 应用程序本身的一部分,因此它是意见之一。几点: 1.) 为登录过程构建 Web API,可通过 ajax 调用。 2.) 用 Authorize 装饰你的控制器类。这样,任何未经授权的调用都不会成功。
  • @alpinescrambler 感谢您的回复,是的,我正在刷新整页,但这只是第一次(在登录期间)。我这样做是因为我不知道如何在 SPA 视图中进行 Facebook 身份验证。您能否详细说明第 1 点。 1 在你评论?您能否详细说明我如何使用 webAPI 进行外部 OAuth。再次感谢。

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


【解决方案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>

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

【讨论】:

  • 感谢您的帮助,我会试试这个并返回。
  • 谢谢,真的很有帮助,感激不尽。
猜你喜欢
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多