首先,ajax 请求跟通常的 web 请求本质是相同的,都是 http 请求。理论上服务器端是没法区分该次请求是否是 ajax 请求的,可是,既然标题都已经说了,那么确定是有办法作的。javascript
在 ajax 请求的请求报文里,每每会包含这么一条:X-Requested-With = XMLHttpRequesthtml
这在各大的 javascript 框架上也是这么作的。java
而服务器端就能够根据这一点来判别,该次的请求是不是 ajax 请求。web
而在 ASP.NET MVC 里,也有一个扩展方法:ajax
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。ide
那么就好办了。代码以下:函数
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,那么就会编译错误了。这里仅做演示,由于暂时想不到一个好的命名空间。-_-|||post
那么,只要打上该 Attribute 的 Action,若是构造函数参数为 true 或调用无参构造函数的话,则请求必须为 AJAX 请求。若是构造函数参数为 false,则不能是 AJAX 请求。
若是上述条件不成立,则返回 404 Not Found。