mvc3中有Ajax.ActionLink和Ajax.BeginForm两个方法用来生成ajax的连接和ajax的表单提交。

但是当要访问的连接是一个需要登录的页面,显示时就不太友好了

我简单模拟了一下来说明这个问题

页面中有3个连接,第一个是退出登录,第二是普通连接方式显示一个需要登录的页面,第三个是ajax方式,页面的内容将会在下面显示

@Ajax.ActionLink("ajax show a page need login", "needlogin", new AjaxOptions { UpdateTargetId="container" })
<div id="container"></div>

在未登录的情况下,点击普通方式的连接,跳转到

登录页

点击ajax方式,并不是调转到登陆页去登陆,而是登陆页在下面显示了

当你的登录页是一个比较复杂的页面时,他整个加到了container div中,这就很恶心了

ajax连接,希望整个页面跳转,只能用javascript来跳转了

为此,我们需要写一个自己的验证filter

public class MyAuthAttribute : AuthorizeAttribute{protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){if (filterContext.HttpContext.Request.IsAjaxRequest()){filterContext.Result = new AjaxUnauthorizedResult();return;}base.HandleUnauthorizedRequest(filterContext);}}

其中AjaxUnauthorizedResult是自己定义的类

public class AjaxUnauthorizedResult : JavaScriptResult{public AjaxUnauthorizedResult(){var loginurl = FormsAuthentication.LoginUrl;this.Script = "location.href='" + loginurl + "'";}}

他继承了JavaScriptResult类,用于返回

使用了自己定义的filter之后效果如下

注意浏览器并没有后退按钮,说明他是js调转的

登陆后点击则正常显示,在下面读取了页面的内容并显示

观察普通连接的未登录调转和ajax的未登录跳转我们发现,普通的登录的会多一个参数 ReturnUrl 通过这个参数,我们可以在登录时返回到之前的页面

但对于ajax连接来说,我们不应该返回被请求的/home/needlogin页,而是应该返回调用此页的主页面/home/index页。

如何获取到这个页面呢

查看ajax发起的请求,发现,他在地址上加了X-Requested-With参数,以说明此请求是一个ajax请求,说以在代码中才能用Request.IsAjaxRequest()来判断,我们可以仿照此处来加上发起ajax请求的主页面地址

找到 jquery.unobtrusive-ajax.js 101行

options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });

在下面加一句

options.data.push({ name: "X-Requested-From", value: location.href });

再来看发起的ajax请求,就通过参数附带了当前页面地址信息

如此,我们可以在程序中获取此参数然后构造ResultUrl 参数信息了

注意当使用Ajax.BeginForm时,此参数是post过去的,而Ajax.ActionLink则是get传递

转载于:https://www.cnblogs.com/czcz1024/archive/2012/01/16/2323458.html

mvc3中正确处理ajax访问需要登录的页面相关推荐

  1. console修改 ajax,【快速】chrome中console下ajax访问后台

    封装一个简单的chrome中console下ajax访问后台 方便寻找跨域问题 function httpRequest(opt) { opt = opt || {}; opt.method = op ...

  2. Springmvc拦截所有html和Controller,实现未登录则返回登录页,已登录则可以访问需要登录的页面。

    业务逻辑:后端mvc拦截器拦截所有的*.html和*.app请求(controller的后缀,用于识别controller,也可以换成其它如:userLogin.action),检查登录状态如果未登录 ...

  3. oracle安装 sysi,在Oracle 10g 中如何以sys的身份登录isqlplus页面

    在linux上安装完成Oracle 10g以后,我们常常会用到isqlplus来执行SQL语句.但正常的isqlplus登录界面只支持以普通用户的身份进行登录,而我们有时又必须用到sys身份的权限才能 ...

  4. java 登录编程_Java编程通过session访问需要登录的页面

    使用Java访问一般网页,进行数据抓取等比较简单,直接用URL和URLConnection连接所需要的网站地址即可,然后对返回的html源码进行处理分析,获取感兴趣的内容. 不过如果是需要登录后才能访 ...

  5. 如何以sys用户登录oracle,在Oracle 10g 中如何以sys的身份登录isqlplus页面

    在linux上安装完成Oracle 10g以后,我们常常会用到isqlplus来执行SQL语句.但正常的isqlplus登录界面只支持以普通用户的身份进行登录,而我们有时又必须用到sys身份的权限才能 ...

  6. idea中tomcat启动但是访问不了localhost8080页面

    1.点击Edit Configurations 2.进入界面后点击Deployment,然后点击最右边的加号,添加你安装的tomcat下的webapps下的ROOT 然后下面的Application ...

  7. 一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...

  8. spring返回数据使用ajax,【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中...

    问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...

  9. jsonp的原理·jsonp是不是ajax中实现跨域访问的技术

    ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据, 而是返回一段调用某个函数的js代码,在s ...

最新文章

  1. 26张图带你彻底搞懂volatile关键字
  2. 以太坊智能合约开发:让合约接受转账
  3. ACE入门---很好的文章
  4. SVM基本思想及入门学习(转载+自己解释为什么minL(w)变成minmaxL(a,w))
  5. vscode正则表达式替换php数组,vscode正则替换
  6. 模型压缩:模型量化打怪升级之路-工具篇
  7. 大学计算机网络实验2,河南工业大学计算机网络实验报告2
  8. 面向对象编程 和 面向接口编程
  9. php ddl,MySQL定义语言[DDL]
  10. 身份证号码中间显示*星号
  11. 光缆弹性模量计算_光缆的基本常识
  12. 解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
  13. 开源网站云查杀方案之ClamAV服务器的搭建
  14. BT5 CDLinux+U盘启动 破解无线网络
  15. Linus最高产,2021 Linux内核开发统计出炉
  16. 一个阿里小二“改写”了《阿里巴巴与四十大盗》 | 悦读
  17. 第九章(8)多元函数的极值及求法
  18. 微信小程序导航栏切换页面
  19. xampp 配置php版本,XAMPP各个版本配置
  20. python人脸识别第三方库_GitHub - bennystar/face_collection: python的face_recognition人脸识别库的使用...

热门文章

  1. 树莓派4b设置RTC时钟模块DS3231
  2. python菜单设计_python django 数据库树形菜单的设计
  3. python中怎么比较两个列表的大小_Python:找到两个列表中存在的给定长度的公共子列表...
  4. 原地不动 福玛特机器人_智能扫地机器人一直在原地打转是怎么回事以及解决办法...
  5. 7th思妙想 Fun事连连,今天范式7岁啦!
  6. 第四范式重磅发布企业级AI操作系统Sage AIOS
  7. c++计算eigen随笔(9)-数组、矩阵、向量(2)
  8. 【效率】几个免费的富文本编辑器,这不完胜付费?
  9. 深度强化学习入门介绍
  10. 【数据分析】离婚率逐年上升,数据分析告诉你背后的主因竟然是它!