Asp.net mvc 4 如何处理Durandal MVC路由?

Asp.net mvc 4 如何处理Durandal MVC路由?,asp.net-mvc-4,asp.net-mvc-routing,durandal,durandal-navigation,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 Blo

我已经用durandal介绍了mvc区域的概念

我的等级制度是

Area.Web
    Areas
        Blog
           Controller
                 SocialController
                   Social
           View
        Task
           Controller
           View
    Scripts
        App
          Blog
            ViewModels
根据我的url,我有到该地区的路线。例如,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)中的博客


请让我知道,如何解决这个问题。是否可以在所有路线和应用程序中包含区域名称。首先设置您应该重新考虑项目架构的内容。例如,如果您需要使用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>

))

这是否意味着您希望在一个MVC应用程序中托管多个Durandal Spa?Durandal通常有一个入口点MVC控制器,并在App/views文件夹中存储视图。或者您想使用服务器端渲染页面(*.cshtml)?请提供更多信息。你是对的。我尝试在单个mvc应用程序中托管多个spa。问题是当我试图访问localhost/sitename/Task这样的应用程序时。它从url中排除了sitename和task。是否可以在url中始终维护这些信息。如果我能够维护这些信息,那就太好了。我可以问一下,这种架构背后的原因是什么吗?为什么不使用一个带儿童路由器的Durandal应用程序呢?感谢您的回复。我的目标是基于url,必须选择SPA。我已经开发了基于国家的应用程序。因此,如果用户选择localhost/gb,它将调用gb区域。此外,我的控制器名称在这两个区域中都相同。在上述情况下,如果控制器名称不同,则将起作用。请让我知道如何在这两个区域使用相同的控制器名称?我已经尝试了上述情况,当仅使用{controller}/{action}/{id}指定了一个路由(任务或博客)时,效果很好。因为我部署了像localhost/durandalapp这样的应用程序,并通过localhost/durandalapp/gb访问每个版本,所以shell请求抛出404。因为请求类似于localhost/durandalapp/home/shell。url中缺少gb。我们已经指定了如下app.setRoot('viewmodels/home/shell','entry')那样的根目录;所以路线图无法找到确切的控制器。@gopimanikandan,这里有人遗漏了什么(不确定是我还是你)。我有点确定Durandal中的路径是相对于包含当前Durandal main.js的文件夹的(例如到AppBlog)。为什么有路径“viewmodels/home/shell”?您确定其路径正确吗(viewmodels文件夹中是否有“home”子文件夹?——未在任何地方说明)?至于我的代码,访问localhost/task将导致从TaskApp加载Durandal应用程序,Durandal JS代码中的所有路径都将相对于TaskApp文件夹。是的,我在视图模型中有子文件夹。问题是mvc路由无法找到控制器,因为url中缺少gb。有没有办法在每一条路线中都包含gb。
<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" }