【问题标题】:How to handle Durandal MVC routing?如何处理 Durandal MVC 路由?
【发布时间】:2014-01-13 13:08:38
【问题描述】:

我已经用 durandal 引入了 mvc 区域概念

我的层次结构是

Area.Web
    Areas
        Blog
           Controller
                 SocialController
                   Social
           View
        Task
           Controller
           View
    Scripts
        App
          Blog
            ViewModels

我有根据我的网址前往该地区的路线。例如,本地主机/博客

我的路线是:

routes.MapRoute(
name: "blog",
url: "blog/{action}/{id}",
defaults: new { controller = "blog", action = "Index", id = UrlParameter.Optional },
                        namespaces: new string[] { "Area.Web.Blog.Controllers" }
                    );

routes.MapRoute(
    name: "Task",
    url: "Task/{action}/{id}",
defaults: new { controller = "task", action = "Index", id = UrlParameter.Optional},
    namespaces: new string[] { "Area.Web.Task.Controllers" }
);

当我尝试导航到 localhost/blog 时,它会调用正确的控制器并正确呈现。当 durandal 路由发生时博客被排除。所以我的路由 url 无法获取控制器。

 app.setRoot('viewmodels/social/home', 'entrance');

以下路由抛出 404 异常,因为它忽略了路由 url (localhost/social/home) 中的博客

请告诉我,如何解决此问题。 是否可以在所有路线和 app.set 中包含区域名称

【问题讨论】:

  • 这是否意味着您想在一个 MVC 应用程序中托管多个 Durandal SPA? Durandal 通常有一个入口点 MVC 控制器并将视图存储在 App/views 文件夹中。或者您想使用服务器端渲染页面 (*.cshtml) ?请提供更多信息。
  • 你是对的。我试图在单个 mvc 应用程序中托管多个 spa。问题是当我尝试访问 localhost/sitename/Task 之类的应用程序时。它从 url 中排除了站点名称和任务。是否可以始终在 url 中维护这些信息。如果我能够维护这些信息,那就没问题了
  • 请问您这种架构背后的原因是什么?为什么不将一个 Durandal 应用程序与子路由器一起使用?

标签: asp.net-mvc-4 asp.net-mvc-routing durandal durandal-navigation


【解决方案1】:

首先恕我直言,您应该重新考虑您的项目架构。例如,如果您需要使用 Weyland 优化此应用程序,则两个 SPA 将最终在同一个文件中,这不会为您提供所需的分离。

但是,您可以创建单独的文件夹,并为每个 SPA 提供自己的 main.js 文件,而不是将它们都放在 app 文件夹下。

在这种情况下,您将具有以下项目结构:

Area.Web
    AppBlog
        Services
        Views
        ViewModels
        main.js
    AppTask
        Services
        Views
        ViewModels
        main.js 
    Areas
        Blog
           Controller
           View
        Task
           Controller
           View
    Scripts
       durandal
       etc.
    Content
    etc.

您在博客区的视图将使用以下 JS 导入:

<script src="~/Scripts/require.js" data-main="@Url.Content("~/AppBlog/main")"></script>

而任务区将使用

<script src="~/Scripts/require.js" data-main="@Url.Content("~/AppBlog/main")"></script>

在这样的设置中,您的路线看起来与您的代码中的路线完全相同

编辑

routes.MapRoute(
name: "blog",
url: "blog/{action}/{id}",
defaults: new { controller = "home", action = "Index", id = UrlParameter.Optional },
                        namespaces: new string[] { "Area.Web.Blog.Controllers" }
                    );

routes.MapRoute(
    name: "Task",
    url: "Task/{action}/{id}",
defaults: new { controller = "home", action = "Index", id = UrlParameter.Optional},
    namespaces: new string[] { "Area.Web.Task.Controllers" }

);

【讨论】:

  • 感谢您的回复。我的目标将基于 url,必须选择 SPA。我根据国家/地区开发了该应用程序。所以如果用户选择localhost/gb,就会调用GB区域。我的控制器名称在这两个区域也相同。如果控制器名称不同,则在上述情况下将起作用。请告诉我如何在两个区域使用相同的控制器名称?
  • 我已经尝试过上述情况,当{controller}/{action}/{id} 仅指定一个路由(任务或博客)时,它可以正常工作。因为我已经部署了像localhost/durandalapp这样的应用程序,并且通过localhost/durandalapp/gb访问每个版本,所以shell请求抛出404。由于像localhost/durandalapp/home/shell这样的请求。网址中缺少 gb。我们已经指定了根,如下所示 app.setRoot('viewmodels/home/shell', 'entrance');所以路线图无法找到确切的控制器。
  • @gopimanikandan,这里有人遗漏了一些东西(不确定是我还是你)。我有点确定 Durandal 中的路径是相对于包含当前 Durandal main.js 的文件夹(例如到 AppBlog)。为什么你有路径'viewmodels/home/shell'?你确定它的路径正确吗(你在viewmodels文件夹中有'home'子文件夹吗? - 它没有在任何地方说明)?至于我的代码,访问 localhost/task 将导致从 TaskApp 加载 Durandal App,并且 Durandal JS 代码中的所有路径都将相对于 TaskApp 文件夹。
  • 是的,我在视图模型中有子文件夹。问题是 mvc 路由无法找到控制器,因为 url 中缺少 gb。有没有办法在每条路线中包含 gb。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2011-01-08
  • 2017-03-29
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多