Controller 的 Action 只接受 Ajax 请求
ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。
2014-08-27 14:19 by h82258652, 555 阅读, 2 评论, 收藏, 编辑
首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求。理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的。
在 ajax 请求的请求报文里,往往会包含这么一条:X-Requested-With = XMLHttpRequest

这在各大的 javascript 框架上也是这么做的。
而服务器端就可以根据这一点来判别,该次的请求是否是 ajax 请求。
而在 ASP.NET MVC 里,也有一个扩展方法:

1 namespace System.Web.Mvc
2 {
3 // 摘要:
4 // 表示一个类,该类对 System.Web.HttpRequestBase 类进行了扩展,在其中添加了确定 HTTP 请求是否为 AJAX 请求的功能。
5 public static class AjaxRequestExtensions
6 {
7 // 摘要:
8 // 确定指定的 HTTP 请求是否为 AJAX 请求。
9 //
10 // 参数:
11 // request:
12 // HTTP 请求。
13 //
14 // 返回结果:
15 // 如果指定的 HTTP 请求是 AJAX 请求,则为 true;否则为 false。
16 //
17 // 异常:
18 // System.ArgumentNullException:
19 // request 参数为 null(在 Visual Basic 中为 Nothing)。
20 public static bool IsAjaxRequest(this HttpRequestBase request);
21 }
22 }

但是呢,这只能在 Action 内部调用了,使得 Action 变得臃肿,需要在 Action 内部分别返回是否是 ajax 请求的结果。
如果能像打上 HttpGet、HttpPost 之类标签的办法来做就更好了。
查阅资料得出,要这样做,需要我们自己写一个 Attribute,并且这个 Attribute 继承自抽象类 ActionMethodSelectorAttribute。
那么就好办了。代码如下:

1 namespace System.Web.Mvc
2 {
3 /// <summary>
4 /// 表示一个特性,该特性用于限制操作方法,以便该方法仅处理 AJAX 请求。
5 /// </summary>
6 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
7 public sealed class AjaxRequestAttribute : ActionMethodSelectorAttribute
8 {
9 /// <summary>
10 /// 初始化 AjaxRequestAttribute 类的新实例。
11 /// </summary>
12 public AjaxRequestAttribute()
13 : this(true)
14 {
15 }
16
17 /// <summary>
18 /// 初始化 AjaxRequestAttribute 类的新实例。
19 /// </summary>
20 /// <param name="isAjaxRequest">限制操作方法是否是 AJAX 请求。</param>
21 public AjaxRequestAttribute(bool isAjaxRequest)
22 {
23 IsAjaxRequest = isAjaxRequest;
24 }
25
26 /// <summary>
27 /// 指示操作方法是否是 AJAX 请求。
28 /// </summary>
29 public bool IsAjaxRequest
30 {
31 get;
32 private set;
33 }
34
35 /// <summary>
36 /// 确定操作方法 AJAX 请求对指定的控制器上下文是否有效。
37 /// </summary>
38 /// <param name="controllerContext">控制器上下文。</param>
39 /// <param name="methodInfo">有关操作方法的信息。</param>
40 /// <returns>如果操作方法请求对指定的控制器上下文有效,则为 true;否则为 false。</returns>
41 public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
42 {
43 if (controllerContext == null)
44 {
45 throw new ArgumentNullException("controllerContext");
46 }
47
48 bool isAjaxRequest = controllerContext.HttpContext.Request.IsAjaxRequest();
49 return IsAjaxRequest == isAjaxRequest;
50 }
51 }
52 }

PS:实际运用不建议命名空间这样做(与系统类库或泛用第三方类库重合),假如某一天 MVC 团队真的加了这么一个 Attribute,那么就会编译错误了。这里仅作演示,因为暂时想不到一个好的命名空间。-_-|||
那么,只要打上该 Attribute 的 Action,如果构造函数参数为 true 或调用无参构造函数的话,则请求必须为 AJAX 请求。如果构造函数参数为 false,则不能是 AJAX 请求。
如果上述条件不成立,则返回 404 Not Found。
Controller 的 Action 只接受 Ajax 请求的更多相关文章
- ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。
首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求.理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的. 在 ajax ...
- 使用Attribute限制Action只接受Ajax请求
原博文 https://www.cnblogs.com/h82258652/p/3939365.html 代码 /// <summary> /// 仅允许Ajax操作 /// </s ...
- 让webapi只接受ajax请求
为了测试先做一个简单的webapi,直接用新建项目时默认的就可以了. 在浏览器中测试request get,得到结果 然后再项目中新建一个AjaxOnly的类 AjaxOnly继承Acti ...
- 限制action所接受的请求方式或请求参数
原文:http://www.cnblogs.com/liukemng/p/3726897.html 2.限制action所接受的请求方式(get或post): 之前我们在HelloWorldContr ...
- 如何判断一个请求为ajax请求?
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和XML). ajax的请求头如下: 如上图所示具有“X-Request-With”属性,该 ...
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染
在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...
- springmvc接受及响应ajax请求。 以及@RequestBody 和@ResponseBody注解的使用
1.发送ajax请求 $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8& ...
- 利用闭包实现多次ajax请求只执行最后一次
点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...
- 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...
随机推荐
- Linux查看网卡流量(转)
sar 这个工具RHEL5自带有,默认也安装. 一个强大的工具(好像这些工具都蛮强的),参数很多,有时间man一下. -n参数很有用,他有6个不同的开关:DEV | EDEV | NFS | NFSD ...
- 【二分法】 HDU 2446 Shell Pyramid
意甲冠军:非常多,形成一个金字塔球 文章x层 x*(x+1)/ 2 球 给你个S 金字塔的一层代表第一数字向下S球 它是其中 这层中的第几行 第几列 公式 1 : x*(x+1)*(x+2)/ 6 ...
- 线程池ThreadPoolExecutor使用简介(转)
一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...
- VARCHAR2 他们占几个字节? NLS_LENGTH_SEMANTICS,nls_language
ORACLE初始化参数:NLS_LENGTH_SEMANTICS 初始化參数NLS_LENGTH_SEMANTICS用于指定CHAR列或VARCHAR2列的长度定义方式,默认值为BYTE. 当设置该參 ...
- 流动python - 写port扫描仪和各种并发尝试(多线程/多进程/gevent/futures)
port扫描仪的原理非常easy.没有什么比操作更socket,能够connect它认为,port打开. import socket def scan(port): s = socket.socket ...
- cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
二战中被称为二战飞机飞机,当然,以飞机作业.这是一个游戏,我们必须加入一个飞机--这是我们的英雄. 首先创建一个层(PlaneLayer)要显示飞机.然后,create飞机初始化方法 module(& ...
- 第6章 适配器模式(Adapter Pattern)
原文 第6章 适配器模式(Adapter Pattern) 概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 解决的问 ...
- ios 调节器 modal 得知
代码中创建: 1.appdelegate 该contoller放置controller下一个 - (BOOL)application:(UIApplication *)application didF ...
- javascript之Style物
Background 属性 属性 描写叙述 background 在一行中设置全部的背景属性 ...
- crawler_网络爬虫之数据分析_httpwatcher
所谓爬虫,首先要通过各种手段爬取到想要站点的数据. web2.0之后,各种网络站点类型越来越多,早期的站点多为静态页面[html .htm],后来逐步加入 jsp.asp,等交互性强的页面.再后来随着 ...