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 请求的更多相关文章

  1. ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。

    首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求.理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的. 在 ajax ...

  2. 使用Attribute限制Action只接受Ajax请求

    原博文 https://www.cnblogs.com/h82258652/p/3939365.html 代码 /// <summary> /// 仅允许Ajax操作 /// </s ...

  3. 让webapi只接受ajax请求

    为了测试先做一个简单的webapi,直接用新建项目时默认的就可以了.   在浏览器中测试request get,得到结果   然后再项目中新建一个AjaxOnly的类   AjaxOnly继承Acti ...

  4. 限制action所接受的请求方式或请求参数

    原文:http://www.cnblogs.com/liukemng/p/3726897.html 2.限制action所接受的请求方式(get或post): 之前我们在HelloWorldContr ...

  5. 如何判断一个请求为ajax请求?

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和XML). ajax的请求头如下: 如上图所示具有“X-Request-With”属性,该 ...

  6. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

  7. springmvc接受及响应ajax请求。 以及@RequestBody 和@ResponseBody注解的使用

    1.发送ajax请求 $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8& ...

  8. 利用闭包实现多次ajax请求只执行最后一次

    点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...

  9. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action

    上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...

随机推荐

  1. POJ 3934 Queue(DP)

    Queue Description Linda is a teacher in ACM kindergarten. She is in charge of n kids. Because the di ...

  2. SWI-Prolog

    上个月突然看到Prolog这门语言,它特殊的语法吸引了我,但是经过我一段时间的学习,发现它也不像网络上传说的那样神奇,不过我依然对它很感兴趣,有前辈说Prolog本身并不强大,但是用来作为一门辅助语言 ...

  3. POJ 2774 后缀数组:查找最长公共子

    思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...

  4. 前端是Sencha Touch+ Cordova(转)

    从13年初开始,我的关注点一直在两个点上,一个是股票,一个是移动前端和大数据技术,互联网金融的发展会让互联网证券越来越火热,当然,我也希望将这两个关注点结合到一起,做一些事情.   现在,我的APP和 ...

  5. 3.Chrome数据同步服务分析--server一片

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlcjE2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  6. Java Web整合开发(4) -- JSP

    JSP脚本中的9个内置对象: application:    javax.servlet.ServletContext config:          javax.servlet.ServletCo ...

  7. HDU 2120 Ice_cream&#39;s world I(并检查集合)

    职务地址:HDU 2120 这题尽管字数不多,但就是看不懂. . 意思是求最多有多少个被墙围起来的区域.显然就是求环的个数.然后用并查集求环个数就能够了. 代码例如以下: #include <i ...

  8. 纯js客服插件集qq、旺旺、skype、百度hi、msn

    原文 纯js客服插件集qq.旺旺.skype.百度hi.msn 客服插件,集qq.旺旺.skype.百度hi.msn 等 即时通讯工具,并可自己添加支持的通讯工具,极简主义,用法自己琢磨.我的博客 h ...

  9. ExtJs在disabled和readOnly美学分析

    ExtJs中disabled和readOnly美观度的分析 ExtJs中.假设设置输入框为仅仅读属性,一般第一考虑的都是readonly=true 它的效果和正常输入框一样,可是不同意输入: 然而,它 ...

  10. dapper的Dapper-Extensions用法(一)

    dapper的Dapper-Extensions用法(一) Dapper-Extensions Dapper Extensions is a small library that complement ...