去除angularjs路由的显眼的#号
在接触到angularj并完成第一个demo后,惊奇地发现居然还可以这样开发前端界面。个人喜欢的一个功能点就是ng的路由功能,可以很好地将视图放入多个文件中。但最基础的使用会给url添加一个显眼的#,因此从网上搜索了很多看到大多的做法是开启html5模式url,示例如下:
angular.module("blogApp", ['ngRoute'])
.config(function ($routeProvider, $locationProvider) {
$routeProvider.when("/blog/home", { templateUrl: "/page/home.html" })
.when("/blog/article", { templateUrl: "/page/article.html" })
.when("/blog/share", { templateUrl: "/page/share.html" })
.when("/blog/about", { templateUrl: "/page/about.html" })
.otherwise({ redirectTo: "/blog/home" });
$locationProvider.html5Mode(true);
});
并在head中添加:<base href="/">,然后就可以使用ng的路由功能了。
但是这样有一个小问题,就是如果进行刷新,这样如果当前url非otherwise指定的地址的话,就会报404错误,这是因为服务端没有对应的页面。或者保存了一个中间的地址,下次要重新使用时也会发生同样的事,所以对于这类的现有的方案就不适用了。因为我后台是使用asp.net mvc所以对这个问题的一个解决方法如下:
1. 首先在routeconfig中配置一条路由,把从前端过来的匹配的url都映射到Home的Index动作中,代码如下:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "BLOG",
url: "blog/{*others}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
2. 根据上步,所有刷新操作都会映射到/Home/Index,这样就可以在Index方法中获取实际的请求URL,然后把URL保存到ViewBag中,以供视图中使用,代码如下:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Url = Request.RawUrl;
return View();
}
}
3. 在ng的控制器中增加currentUrl属性,并通过ViewBag将Url赋给它,然后通过$location.path($scope.currentUrl)来将视图切换到刷新时的路由上,代码如下:
angular.module("blogApp", ['ngRoute'])
.config(function ($routeProvider, $locationProvider) {
$routeProvider.when("/blog/home", { templateUrl: "/page/home.html" })
.when("/blog/article", { templateUrl: "/page/article.html" })
.when("/blog/share", { templateUrl: "/page/share.html" })
.when("/blog/about", { templateUrl: "/page/about.html" })
.otherwise({ redirectTo: "/blog/home" });
$locationProvider.html5Mode(true);
})
.controller("blogCtrl", function ($scope, $route, $location) {
$scope.currentUrl = '@ViewBag.Url';
$location.path($scope.currentUrl);
$scope.$route = $route;
});
以上就是我的解决方案。其他语言框架的都可以使用类似的方式来完成。
去除angularjs路由的显眼的#号的更多相关文章
- AngularJS 路由
AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常 ...
- 【转】AngularJS路由和模板
1. AngularJS路由介绍 AngularJS路由功能是一个纯前端的解决方案,与我们熟悉的后台路由不太一样.后台路由,通过不同的URL会路由到不同的控制器上(controller),再渲染(re ...
- AngularJS路由和模板
前言 如果想开发一款类似gmail的web应用,我们怎么做呢? 以jQuery的思路,做响应式的架构设计时,我们要监听所有点击事件,通过事件函数触发我们加载数据,提交,弹框,验证等的功能:以 Angu ...
- AngularJS 路由精分
AngularJS 路由机制是由ngRoute模块提供,它允许我们将视图分解成布局和模板视图,根据url变化动态的将模板视图加载到布局中,从而实现单页面应用的页面跳转功能. AngularJS 路由允 ...
- [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程
这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 AngularJS“路由”的定义概念 AngularJS最近真的很火,很多同事啊同学 ...
- AngularJS 路由和模板实例及路由地址简化方法
最近一同事在学习AngularJS,在路由与模板的学习过程中遇到了一些问题,于是今天给她写了个例子,顺便分享出来给那些正在学习AngularJS的小伙伴们. 话说这AngularJs 开发项目非常的爽 ...
- Angularjs路由需要了解的那点事
Angularjs路由需要了解的那点事 我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模 ...
- AngularJS路由跳转
AngularJS是一个javascript框架,通过AngularJS这个类库可以实现目前比较流行的单页面应用,AngularJS还具有双向数据绑定的特点,更加适应页面动态内容. 所谓单页面应用就是 ...
- AngularJS进阶(二)AngularJS路由问题解决
AngularJS路由问题解决 遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去.再加一层地址解决了,但是后来发现问题还是来了: Could not resolve 'yhDtlMain ...
随机推荐
- 灰色蓝色系简洁自适应登录HTML页面
自己写了一个简介的登录页面,页面背景为灰色,居中为登录框,登录面板为半透明效果,整体十分美观,登录按钮有JS效果.自己感觉还不错,拿出来分享一下. 页面效果图 源码下载链接:http://files. ...
- install vim
常用命令: [0]安装vim: oee@copener:~$ sudo apt-get install vim vim-scripts vim-doc 刚安装完$HOME目录下只有两个文件:.vim/ ...
- jquery $.ajax()方法
$(function(){ $('#send').click(function(){ $.ajax({ /* *type:要求为String类型的参数,请求方式(post或get)默认为get. *注 ...
- ACM water
1000 纯属适应题 1003 做的时候花了很久,现在看好像也不难 1004 适应题,求下平均就行 1005 要读懂题就行 1007 逆序数,discuss方法 1046 全部暴搜一遍.. ...
- PCB的过孔
在走多层板时,经常需要打过孔,那么过孔是怎么分类的呢?且往下看. (1)通孔:这种孔穿过整个线路板,可以用于内部互连或者作为元件的安装定位孔(用于连接层:生成钻孔文件,在PCB上打孔并在孔内电镀:通常 ...
- 【Unity3D基础教程】给初学者看的Unity教程(五):详解Unity3D中的协程(Coroutine)
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 为什么需要协程 在游戏中有许多过程(Proc ...
- 【转载】 Java 7之基础 - 强引用、弱引用、软引用、虚引用
原文地址:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一 ...
- SQL分页语句
有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL ...
- OLDB读取excel的数据类型不匹配的解决方案(ZT)
1 引言 在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用.笔者在开发“汽车产业链A ...
- Spring事务管理(转)
Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...