1

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

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

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

http://mySite.com/

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

http://mySite.com/Shop

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

你们中的任何人都可以在这个问题上帮助我吗?

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

提前致谢!

丑陋的

4

1 回答 1

2

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

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

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

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

于 2013-10-24T12:47:09.973 回答