Angular路由Html5Mode与.NET共存问题!

  最近用到Angular路由,无刷新的单页切换模式令人眼前一亮,但我是有强迫症的,那个"#"号实在是太刺眼了,太影响美观了!

 1  var mainApp = angular.module("ViewsApp", ['ngRoute']).
 2         config(["$routeProvider", "$locationProvider", function ($routeProvider, $locationProvider) {
 3             $routeProvider.when("/login", {
 4                 templateUrl: "/Route/Views/Login.html",
 5                 controller: function ($scope, $location) {
 6                     $scope.User = {
 7                         UserName: "",
 8                         PassWord:""
 9                     }
10                     $scope.Login = function () {
11                         if ($scope.LoginForm.$valid) {
12                             $location.search({ name: 'Ari', username: 'auser' });
13                             $location.path("/index").replace();//如果你希望跳转后用户不能点击后退按钮(对于登录之后的跳转这种发生在某个跳转之的
14                            // 再次跳转很有用),AngularJS提供了replace()方法来实现这个功能:
15                         }
16                      
17                     }
18                 }
19             }).when("/", {
20                 template: "<h1>内容部分</h1>",
21                 // redirectTo:"/index"
22                 redirectTo: function (route,path,search) {
23                     return "/index";
24                 }
25 
26             }).when("/detail/:id&:name", {
27                 templateUrl: "/Route/Views/Detail.html",
28                 controller: "DetailController",
29                 reloadOnSearch: true,
30             }).otherwise({
31                 template: "<h2>这个是默认的模板哦</h2>",
32                 controller: function ($scope) {
33                 },
34 
35             });
36         }])
View Code

 不过Angular团队提供了解决方案,那就是Hmtl5Mode。使用起来也就是寥寥两步:

1.在配置中:

 angular.module('myApp', ['ngRoute'])
 .config(['$locationProvider', function($locationProvider) {
  $locationProvider.html5Mode(true);
 }]); 

  

2.在HTML文档的HEAD中用标签来指定应用的基础URL:

  <base href="/" /> 

 

 现在看起是这样的了,"#"已经被完美的干掉了。

 

不要高兴的太早,当按下f5后变成这样了:

什么鬼?不过仔细一想.net的运行机制就明白了,请求要先走服务端的,服务端解析根本就没有这个页面,肯定报404错误了!那重写url不就得了

我是这么做的,在web.config 中加入如下代码:

<system.webServer>
    <!--angular重写url-->
    <rewrite>
      <rules>
        <rule name="angularjs routes"
            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" />
          </conditions>
          <action type="Rewrite" url="/Route/Demo.html" />
        </rule>
      </rules>
    </rewrite>
    <!--angular重写url-->
  </system.webServer>

再F5刷新就正常了!^^

 

posted @ 2016-06-17 15:49  李紫能  阅读(334)  评论(0编辑  收藏  举报