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 ...
随机推荐
- Linux 软件 安装到 /usr,/usr/local/ 还是 /opt 目录
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...
- golang interface接口
package main import "fmt" type Shaper interface { Area() float32 } type Square struct { si ...
- 第八章 高级搜索树 (b3)B-树:查找
- 神经网络出现nan原因?以及解决
之前在TensorFlow中实现不同的神经网络,作为新手,发现经常会出现计算的loss中,出现Nan值的情况,总的来说,TensorFlow中出现Nan值的情况有两种,一种是在loss中计算后得到了N ...
- goim源码分析与二次开发-comet分析二
这篇就是完全原版了,作为一个开始,先介绍comet入口文件main.go 第一步是初始化配置,还有白名单.还有性能监口,整体来说入口代码简洁可读性很强 然后开始初始化监控,还有bukcet这里buck ...
- swift和OC - 拆分数组 和 拆分字符串
1. 拆分数组 /// 根据 数组 截取 指定个数返回 多个数组的集合 func splitArray( array: [Date], withSubSize subSize: Int) -> ...
- Halcon的C#二次开发及经验分享
本文涉及面较广,因此很难在所有方面都讲解得很详细,故适合具有一定Halcon开发经验的人阅读. 1.Halcon二次开发的两种方式 ① 使用C#的语法方式逐句改写Halcon代码 优点:各种变量的类型 ...
- FutureTask详解
1 基本概念 1.1 Callable与Future Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值的异步方法.Callable与Runnable类似,但是有返回值.Ca ...
- python的metaclass浅析-乾颐堂
元类一般用于创建类.在执行类定义时,解释器必须要知道这个类的正确的元类.解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类.如果此属性没有定义,它会向上 ...
- type="image"提交表单
<input type="image" style="cursor:pointer; ">