AngularJS html5Mode与ASP.NET MVC路由共存
前言
很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习。前不久公司找我们部门做一个OA系统(想省下几万大洋的费用),第一时间便想到AngularJS,非常适合OA这种单页应用,再配合Twitter的Bootstrap,能在短时间内做出一套漂亮的系统。当然,很大程度上还是想用实践来加强自己对新技术的学习,难得公司有这么个好机会!不过,本文的重点不是一步步开发学习,所以此处省去1万字....
一、问题
AngularJS能如此火有很多原因:双向绑定、减少DOM操作、AJAX等等。AngularJS的路由机制正是实现页面无刷新切换的重点,使用hash(#)在页面内加载模板,而不是跳转到新的页面。如果你不是一个强迫证患者,那么一切都无所谓了,但是我终于还是受不了URL中的那个#号,那么问题来了,怎么能去掉它???
二、解决思路
AngularJS团队不可能考虑不到这个问题,于是有了一个轻轻松松的方法便可以搞定一切,一两句代码而已:$locationProvider.html5Mode(true),AngularJS 1.3版本需要在首页加入<base href="/" />标签。这样似乎没什么问题,URL中的烦人的#号没了,点击页面内链接切换也还是AJAX,可是如果你尝试刷新页面或者复制URL到浏览器中回车的时候,新的问题又来了,报错!其实不应该惊讶,因为后端用的是ASP.NET MVC,刷新页面会先匹配ASP.NET MVC的路由机制,如果找不到URL中对应的Controller和Action自然报错。于是很自然的想到重写ASP.NET MVC的路由,使它能认识我URL中“不存在”的控制器。
重写路由要注意几个问题:
1.几乎所有路由都需要重定向到/Default/Index,因为这是我的首页,其余页面模板都是在这里的ng-view里动态加载的
2.登录功能的路由不需要重写,因为这是一个单独页面,不会嵌套在/Default/Index中
3.还需要忽略favicon.ico的路由请求,否则网站每次刷新都会有一次多余的请求被定位到/Default/Index中
4.把其它Controller中的Actoin当作数据请求源(请求数据使用web api方式会更好),定义一个新的路由规则,比如:app/{controller}/{action}/{id}
代码如下:
a).SingleRoute.cs是自定义的路由重定向类,实现所有路由都重写向到/Default/Index中
- public class SingleRoute : RouteBase
- {
- public override RouteData GetRouteData(HttpContextBase httpContext)
- {
- var data = new RouteData(this, new MvcRouteHandler());
- data.Values.Add("controller", "Default");
- data.Values.Add("action", "Index");
- return data;
- }
- public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
- {
- return null;
- }
- }
b).RouteConfig.RegisterRoutes代码修改
- public class RouteConfig
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- //取消网站图标的路由请求
- routes.IgnoreRoute("favicon.ico");
- //AJAX请求数据路由
- routes.MapRoute(
- name: "DefaultApp",
- url: "app/{controller}/{action}/{id}",
- defaults: new { controller = "Default", action = "Index", id = UrlParameter.Optional }
- );
- //登录路由单独执行
- routes.MapRoute(
- name: "Login",
- url: "login/{action}/{id}",
- defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
- );
- //其余所有路由都跳转到default/index
- routes.Add(new SingleRoute());//单页规则
- }
- }
三、总结
问题已解决,记录并学习
AngularJS html5Mode与ASP.NET MVC路由共存的更多相关文章
- AngularJS html5Mode与ASP.NET MVC路由
AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...
- ASP.NET MVC 路由(一)
ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...
- ASP.NET MVC 路由(二)
ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...
- ASP.NET MVC 路由(三)
ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...
- ASP.NET MVC 路由(四)
ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...
- ASP.NET MVC 路由(五)
ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...
- Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳
http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...
- Asp.Net MVC路由调试好帮手RouteDebugger
Asp.Net MVC路由调试好帮手RouteDebugger 1.获取方式 第一种方法: 在程序包控制台中执行命令 PM> Install-Package routedebugger 安装成功 ...
- ASP.NET MVC路由(5)
ASP.NET MVC路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的实 ...
随机推荐
- sql server事物控制
一.多个数据库 1.存储过程 2.Commit写在 Try...Catch后面 protected void Button1_Click(object sender, EventArgs e) ...
- JDK源码学习系列04----ArrayList
JDK源码学习系列04----ArrayList 1. ...
- 使用crontab创建 linux 系统定时任务#
任务1: 每隔1分钟,运行一次 /home/sn/yeelink.sh文件 ,用于上传数据到www.yeelink.net 1. 先在当时目录里面创建一个cronfile文件 vim cronfile ...
- iOS结合导航控制器和标签栏控制器
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...
- Ognl底层使用
今天,在得知ognl采用.在这里和大家分享一下.我希望能帮助. package com.hcj.test; import java.util.ArrayList; import java.util.L ...
- html风格的滚动条
DIV辊棒的设置 (CSS)2008/09/26 03:07div 控制滚动条2008年01月06日本 星期日 01:181)隐藏滚动条<body style="overflow-x: ...
- 得知Android小遴选程序第七头(他们定义对话框、Gallery、ImageSwitcher)
效果如下面的: 一共一个activity和两个xml. ******当我们须要使用的组件不在setContentView()设置的布局文件里,那我们就须要使用inflate()方 ...
- 直接选择排序----java实现
直接选择排序思路: 从待排序数据中选择第一个假定为最小的下标,然后他后面的与他循环比较,得到真的最小值下标,然后最小值前的那一区段依次后移,并把最小值赋值给第一个元素.第二次时,假定第二个为最小,然后 ...
- ZOJ Problem Set - 2563 Long Dominoes 【如压力dp】
称号:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形.求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的.比較火.链接:这里 ...
- linux 脚本測试网络速度
example: ./netspeed eth0 1 #!/bin/bash 2 3 INTERVAL="1" # update interval in seconds ...