是否可以将AngularJS路由的templateUrl路径定义为与IIS应用程序文件夹结构完全无关?

时间:2017-04-10 15:36:16

标签: angularjs asp.net-mvc iis routing

我已经在这里进行了一些研究,但总是找不到合适的方法来实现它。

我们有MVC / WebAPI2 / AngularJS Web应用程序。

我正在尝试实现这一目标:能够将我的应用程序放在IIS应用程序文件夹结构中的任何位置而无需更改任何代码。这意味着,在我的代码中删除任何IIS应用程序名称。

这是定义的ng-route路径的简单片段:

  

.when(“/”,{templateUrl:“Home / Main”,控制器:“MainController”,   controllerAs:“vm”})

现在,IIS应用程序名为 ReportsWeb (但可以是任何名称)

如果我在默认网站 root下设置 ReportsWeb 应用程序:

  

http://localhost/ReportsWeb/

然后一切正常,并且templateUrl页面加载正常。

但如果应用程序放在另一个IIS应用程序(我们这里的那个名为 RealSuiteApps ,它本身位于默认网站下)

  

http://localhost/RealSuiteApps/ReportsWeb/

然后,模板未加载,因为templateUrl的构造URL不再有效

http://localhost/RealSuiteApps/Home/Main

如果我将templateUrl更改为“/ Home / Main”,则构造的URL无效

http://localhost/Home/Main

如果我将templateUrl更改为“./Home/Main”,则构造的URL再次无效

http://localhost/RealSuiteApps/Home/Main

是否可以相对于IIS层次结构中的最新App名称定义templateUrl 而无需对所有这些名称进行硬编码,以便它可以在任何IIS应用程序树中使用

  

http://localhost/App1/App2/App3/ReportsWeb/

谢谢!

1 个答案:

答案 0 :(得分:0)

我使用grunt-html2js工具在构建时将所有html模板转换为Javascript,后者使用Angular的模板缓存。

我已经定义了我的grunt任务来覆盖默认模块命名为templates/,以便我可以轻松地引用任何模板:

html2js: {
      options: {
        rename: function (moduleName) {
          return moduleName.replace(/^.*[\/\\]/, 'templates/');
        }
      },
      all: {
        src: ['./src/**/*.html', '!./src/index.html'],
        dest: 'tmp/templates.js'
      }

    },

这将创建一个templates.js文件,我可以将其作为脚本标记包含在内。然后我可以访问任何模板:

templatUrl: 'templates/my-template-filename.html'

无论源代码中的路径在哪里。