应用程序中的路由问题使用MVC / Durandal并位于IIS子文件夹中

时间:2013-10-23 13:16:05

标签: asp.net-mvc iis asp.net-mvc-routing durandal

我正在寻找我在标题中提到的问题的解决方案。 首先,您需要知道我在IIS上发布了两个MVC应用程序。第一个应用程序是一种中央管理系统,因此我在IIS中设置了一个名为“管理”的站点。第二个应用程序是一个MVC网上商店,嵌入在网站“管理”中的应用程序(子文件夹)。

对于商店,我使用durandal创建了一个MVC应用程序。

现在好像我有路由问题。当我输入网站“管理”中定义的URL时,我看到了中央管理,这是完全正确的。 URL如下所示:

http://mySite.com/

当我尝试访问我的商店时,我只需访问以下网址:

http://mySite.com/Shop

此应用程序仅包含一个 .cshtml 文件,该文件使用Durandal呈现商店的不同页面。这也有效,但是当我输入我的凭据时,Durandal似乎加入了路由,因为它在URL中添加了“#/”。然后发生的是我被重定向到我的父应用程序(http://mySite.com)的HomeController索引视图。多数民众赞成我不想要的东西!

你们这些人可以帮我解决这个问题吗?

我需要补充的是,当我经营商店时,我在本地没有任何问题,所以我猜这个子文件夹的东西和/或durandal是造成这种行为的原因。

提前致谢!

Yheeky

1 个答案:

答案 0 :(得分:2)

是的,这是导致此行为的子文件夹“Shop”。我遇到了与我正在开发的应用程序完全相同的问题。这是我使用的解决方案。我觉得这有点像黑客,但它确实起了作用。

首先,在深入了解RequireJS配置文档后,我想出了如何将变量传递给main.js文件中的模块。

requirejs.config({
  paths: {
    ...
  },
  config: {
    'modules/routes': {
      subfolder: 'Shop'
    }
  }
});

然后,我在项目的routes.js文件夹下创建了一个/App/modules/模块,该文件夹负责为我的应用程序的其余部分构建URL。在该模块中,我编写了一个函数,用于确定脚本是在本地还是在Web服务器上运行。基于此,它然后使用我在RequireJS配置中传递的subfolder变量来构造应用程序将用于所有路由的根URL。

define(['module'],
  function (module) {
    // if the application is being hosted on http://localhost, do not include the application name
    var domain = window.location.protocol + '//' + window.location.host,
        root = (window.location.hostname !== 'localhost') ? domain + '/' + module.config().subfolder : domain;

    function getUrl(controller, action) {
      return (action) ? root + '/' + controller + '/' + action : root + '/api/' + controller;
    }

    return {
      getUrl: getUrl,
      cart: getUrl('Home', 'Cart'),
      ...
    }
});

请注意,传入'module'以便从RequireJS配置中读取变量非常重要。