如何处理Durandal MVC路由?

时间:2014-01-13 13:08:38

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

我已经用durandal

介绍了mvc区域概念

我的层次结构将是

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

我根据我的网址指向该区域。例如,localhost / blog

我的路线是:

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中包含区域名称

1 个答案:

答案 0 :(得分: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.

您在Blog区域中的视图将使用以下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" }

);