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

首先,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         [SuppressMessage("Microsoft.Design","CA1062")]
42         public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
43         {
44             var isAjaxRequest = controllerContext.HttpContext.Request.IsAjaxRequest();
45             return IsAjaxRequest == isAjaxRequest;
46         }
47     }
48 }

PS:实际运用不建议命名空间这样做(与系统类库或泛用第三方类库重合),假如某一天 MVC 团队真的加了这么一个 Attribute,那么就会编译错误了。这里仅作演示,因为暂时想不到一个好的命名空间。-_-|||

那么,只要打上该 Attribute 的 Action,如果构造函数参数为 true 或调用无参构造函数的话,则请求必须为 AJAX 请求。如果构造函数参数为 false,则不能是 AJAX 请求。

如果上述条件不成立,则返回 404 Not Found。

时间: 2024-11-11 23:29:20

ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。的相关文章

ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据

在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让用户下载,那么在Controller的Action中用Response.Body这个Stream流,来逐步发送文件数据到客户端浏览器是最好的办法. 但是我今天在ASP.NET Core MVC的Controller的Action中使用Response.Body输出数据到客户端浏览器的时候遇到了个问题

[转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添加Action方法之前或者Action方法之后的行为到控制器类中的Action方法中. 一些可能用到Action过滤器的地方有: 日志,异常处理 身份验证和授权 - 限制用户的访问 输出缓存 - 保存一个Action的结果 网络爬虫的过滤 本地化 动态Action - 将一个Action注入到控制器

ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html 有时候你想在调用action方法之前或者action方法之后处理一些逻辑.为了支持这个.ASP.NET MVC同意你创建action过滤器.Action过滤器是自己定义的Attributes.用来标记加入Action方法之前或者Action方法之后的行为到控制器类中的Action方法中. 一些可能用到Action过滤器的地方有: 日志,异常处理 身份验证和授权

Asp.net MVC 中Controller返回值类型ActionResult

内容转自 http://blog.csdn.net/pasic/article/details/7110134 Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必须是一个public方法 必须是实例方法 没有标志NonActionAttribute特性的(NoAction) 不能被重载 必须返回ActionResult类型 如: [csharp] view pl

asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别

转载自 :  <asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别> 先复制过来.. 带Render的方法返回值是void,在方法内部进行输出:不带Render的返回值类型为MvcHtmlString,是一个字符串. Partial和RenderPartial:直接加载视图文件内容:Action和RenderAction:重新执行一次Controller→Model→View的顺序,然后

Asp.net MVC的Controller激活理解

DefaultControllerFactory 是MVC默认的Controller查找和激活工厂类我们可以通过自定义ControllerFactory替换DefaultControllerFactory类来实现IOC的引入 public class DefaultControllerFactory : IControllerFactory{    //其他成员    public DefaultControllerFactory();    public DefaultControllerFa

ASP.NET MVC下的异步Action的定义和执行原理

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理.[本文已经同步到<How ASP.NET MVC Works?>中] 目录 一.基于线程池的请求处理 二.两种异步Action方法的定义     XxxAs

ASP.NET MVC下的异步Action的定义和执行原理[转]

http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理.[本文已经

ASP.NET MVC中Controller与View之间的数据传递总结

在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: Ø Controller向View传递数据 Ø View向Controller传递数据 一.Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData[“Message”] = “Hello word!”; 然后在View中读取Controller中