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

这在各大的 javascript 框架上也是这么做的。
而服务器端就可以根据这一点来判别,该次的请求是否是 ajax 请求。
而在 ASP.NET MVC 里,也有一个扩展方法:
namespace System.Web.Mvc
{
// 摘要:
// 表示一个类,该类对 System.Web.HttpRequestBase 类进行了扩展,在其中添加了确定 HTTP 请求是否为 AJAX 请求的功能。
public static class AjaxRequestExtensions
{
// 摘要:
// 确定指定的 HTTP 请求是否为 AJAX 请求。
//
// 参数:
// request:
// HTTP 请求。
//
// 返回结果:
// 如果指定的 HTTP 请求是 AJAX 请求,则为 true;否则为 false。
//
// 异常:
// System.ArgumentNullException:
// request 参数为 null(在 Visual Basic 中为 Nothing)。
public static bool IsAjaxRequest(this HttpRequestBase request);
}
}
但是呢,这只能在 Action 内部调用了,使得 Action 变得臃肿,需要在 Action 内部分别返回是否是 ajax 请求的结果。
如果能像打上 HttpGet、HttpPost 之类标签的办法来做就更好了。
查阅资料得出,要这样做,需要我们自己写一个 Attribute,并且这个 Attribute 继承自抽象类 ActionMethodSelectorAttribute。
那么就好办了。代码如下:
namespace System.Web.Mvc
{
/// <summary>
/// 表示一个特性,该特性用于限制操作方法,以便该方法仅处理 AJAX 请求。
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class AjaxRequestAttribute : ActionMethodSelectorAttribute
{
/// <summary>
/// 初始化 AjaxRequestAttribute 类的新实例。
/// </summary>
public AjaxRequestAttribute()
: this(true)
{
} /// <summary>
/// 初始化 AjaxRequestAttribute 类的新实例。
/// </summary>
/// <param name="isAjaxRequest">限制操作方法是否是 AJAX 请求。</param>
public AjaxRequestAttribute(bool isAjaxRequest)
{
IsAjaxRequest = isAjaxRequest;
} /// <summary>
/// 指示操作方法是否是 AJAX 请求。
/// </summary>
public bool IsAjaxRequest
{
get;
private set;
} /// <summary>
/// 确定操作方法 AJAX 请求对指定的控制器上下文是否有效。
/// </summary>
/// <param name="controllerContext">控制器上下文。</param>
/// <param name="methodInfo">有关操作方法的信息。</param>
/// <returns>如果操作方法请求对指定的控制器上下文有效,则为 true;否则为 false。</returns>
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
} bool isAjaxRequest = controllerContext.HttpContext.Request.IsAjaxRequest();
return IsAjaxRequest == isAjaxRequest;
}
}
}
PS:实际运用不建议命名空间这样做(与系统类库或泛用第三方类库重合),假如某一天 MVC 团队真的加了这么一个 Attribute,那么就会编译错误了。这里仅作演示,因为暂时想不到一个好的命名空间。-_-|||
那么,只要打上该 Attribute 的 Action,如果构造函数参数为 true 或调用无参构造函数的话,则请求必须为 AJAX 请求。如果构造函数参数为 false,则不能是 AJAX 请求。
如果上述条件不成立,则返回 404 Not Found。
ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。的更多相关文章
- Controller 的 Action 只接受 Ajax 请求
ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求. 2014-08-27 14:19 by h82258652, 555 阅读, 2 评论, 收藏, 编辑 首 ...
- 使用Attribute限制Action只接受Ajax请求
原博文 https://www.cnblogs.com/h82258652/p/3939365.html 代码 /// <summary> /// 仅允许Ajax操作 /// </s ...
- Asp.Net MVC中Controller、Action、View是如何激活调用的
上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...
- 让webapi只接受ajax请求
为了测试先做一个简单的webapi,直接用新建项目时默认的就可以了. 在浏览器中测试request get,得到结果 然后再项目中新建一个AjaxOnly的类 AjaxOnly继承Acti ...
- 返璞归真 asp.net mvc (3) - Controller/Action
原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...
- ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost
我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...
- ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据
在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...
- [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...
- ASP.NET MVC中controller和view相互传值的方式
ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...
随机推荐
- android热门消息推送横向测评![转]
关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做 ...
- golang 打印变量类型
fmt.Println("type:", reflect.TypeOf(err.Error()))
- poj1182(带权并查集)
题目链接:http://poj.org/problem?id=1182 题意:题目告诉有 3 种动物,互相吃与被吃,现在告诉你 m 句话,其中有真有假,叫你判断假的个数 ( 如果前面没有与 ...
- python之socket运用之执行命令
服务端的代码 import socket import subprocess HOST = "127.0.0.1" PORT = 5001 ip_bind = (HOST,PORT ...
- Nginx配置杂记(转)
转至:http://www.cnblogs.com/kuangke/p/5619400.html Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,相较 ...
- jquery源码学习-初始(1)
最近几天一直在研究jquery源码,由于水平太低看得昏头转向.本来理解的也不是很深刻,下面就用自己的想法来说下jquery是如何定义构造函数初始化的.如果有什么不对的地方,希望个位高手指出. 首先要了 ...
- linux用户和组
1.用户隶属于用户组的. 2.用户与用户组配置文件 1)用户组配置文件 /etc/group 第一列:用户组的组名 第二列:组密码(真正的密码存储在了gshadow中) 第三列:用户组组ID,用户组唯 ...
- 清除所有Cookie
代码 /// <summary> /// 清除所有Cookie /// </summary> public static void RemoveAll() { System.W ...
- 判断浏览器是ie9座特殊处理
function ie(){ var agent = navigator.userAgent.toLowerCase();//判断浏览器版本 return (!!window.ActiveXObjec ...
- python创建独立虚拟工作环境方法
前言: python的组件非常之多,有时这个项目依赖m个组件,有时那个项目依赖n个组件,时间一长很容易导致系统python环境的臃肿不堪,由此便有了virtualenv.virtualenvwrapp ...