我们正在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>
项目结构:
答案 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模式起作用。请记住,如果从根文件夹
答案 3 :(得分:0)
我刚刚将<base href="@Url.Content("~/")" />
添加到我的布局页面,一切正常。我在重新加载(刷新或F5)页面时遇到问题,该页面将整个URL发送到StateProvider中带有$locationprovider.html5Mode(true);
的服务器,但是当我从stateprovider中删除它时刷新问题已解决。我将该网站作为网站上的应用程序。