在将站点托管到IIS之后,AngularJS路由无法正常工作

时间:2015-02-23 16:52:57

标签: asp.net-mvc angularjs iis-7 single-page-application angularjs-routing

我们正在ASP.NET MVC框架中使用AngularJS创建SPA技术,从VS2013运行时,页面之间的AngularJS路由正常工作,但是在将应用程序托管到IIS7.5路由不能正常工作之后,

路由脚本:

   var appRoot = angular.module('main', ['ngRoute', 'ngGrid', 'ngResource']);     //Define the main module

    appRoot
        .config(['$routeProvider', function ($routeProvider) {
            //Setup routes to load partial templates from server. TemplateUrl is the location for the server view (Razor .cshtml view)
            $routeProvider
                .when('/home', { templateUrl: '/home/main', controller: 'HomeController' }) .otherwise({ redirectTo: '/home' });
        }])
        .controller('RootController', ['$scope', '$route', '$routeParams', '$location', function ($scope, $route, $routeParams, $location) {
            $scope.$on('$routeChangeSuccess', function (e, current, previous) {
                $scope.activeViewPath = $location.path();
            });
        }]);

的index.html:

 <li class="mt" data-ng-class="{active : activeViewPath==='/home'}">
                    <a href='#/home'>
                        <i class="fa fa-dashboard"></i>
                        <span>Dashboard Home</span>
                    </a>
                </li>


  <div class="col-lg-9 main-chart" ng-view="">
                </div>

项目结构:

enter image description here

4 个答案:

答案 0 :(得分:3)

在IIS上运行时会出现任何JS错误吗?

你正在使用捆绑包吗?如果是,请检查是否因为缩小/捆绑创建添加而发生问题 BundleTable.EnableOptimizations = true;RegisterBundles方法中再次尝试在VS。

否则我建议您在本地IIS上运行(右键单击项目,选项卡“Web”,“服务器”部分)并查看它是否正常工作。

根据您的路由,您应该在模板头中<base href="@Url.Content("~/")" />并在路由配置中使用$locationProvider.html5Mode(true);从网址中删除“#”。

如果以上都不是有用的,请在您的请求中添加更多详细信息。

度过愉快的一天,

阿尔贝托

答案 1 :(得分:3)

您是将解决方案部署为网站还是虚拟路径上的应用程序?换句话说,当你部署你的应用程序时,url是什么?它是“ myapp.mydomain.com ”还是“ domain.com/myapp ”?

如果是后者,那么问题是模板{ templateUrl: '/home/main' }的请求将转到 domain.com/home/main 而不是 domain.com/myapp / home / main 当你期待它时。

根据:Stating directive templateUrl relative to root只需在模板网址中删除“/”,它就应该有效:{ templateUrl: 'home/main' }

另一种选择是将您的网站部署到自己的子域。

答案 2 :(得分:2)

你必须编辑一个web.config文件来进行重写,并在索引上像这个<base href="/myAppNameOnIIS/">没有应用程序名称,刷新将使用web.config文件正常工作

<?xml version="1.0" encoding="UTF-8"?>
 <configuration>
<system.webServer>
    <rewrite>
      <rules>
        <rule name="Main Rule" stopProcessing="true">
                <match url=".*" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
                    <add input="{REQUEST_URI}" matchType="Pattern" pattern="views/(.*)" negate="true" />
                </conditions>
                <action type="Rewrite" url="/bidocs/" />
            </rule>    
        </rules>
    </rewrite> 
    <staticContent>
        <mimeMap fileExtension=".json" mimeType="application/json" />
        <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
        <mimeMap fileExtension=".wof2" mimeType="application/font-woff" />          
    </staticContent>
    <handlers>
        <add name="fonts2" path="*.woff2" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" preCondition="bitness64" />
        <add name="fonts" path="*.woff" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" preCondition="bitness64" />          
        <add name="JSON" path="*.json" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" preCondition="bitness64" />
    </handlers>
</system.webServer>

我使用此<action type="Rewrite" url="/myAppNameOnIIS/" />修复它以使HTML5模式起作用。请记住,如果从根文件夹

运行应用程序,则此设置可能无法在localhost服务器上运行

答案 3 :(得分:0)

我刚刚将<base href="@Url.Content("~/")" />添加到我的布局页面,一切正常。我在重新加载(刷新或F5)页面时遇到问题,该页面将整个URL发送到StateProvider中带有$locationprovider.html5Mode(true);的服务器,但是当我从stateprovider中删除它时刷新问题已解决。我将该网站作为网站上的应用程序。