ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。
2014-08-27 14:19
363 查看
首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求。理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的。
在 ajax 请求的请求报文里,往往会包含这么一条:X-Requested-With = XMLHttpRequest
这在各大的 javascript 框架上也是这么做的。
而服务器端就可以根据这一点来判别,该次的请求是否是 ajax 请求。
而在 ASP.NET MVC 里,也有一个扩展方法:
但是呢,这只能在 Action 内部调用了,使得 Action 变得臃肿,需要在 Action 内部分别返回是否是 ajax 请求的结果。
如果能像打上 HttpGet、HttpPost 之类标签的办法来做就更好了。
查阅资料得出,要这样做,需要我们自己写一个 Attribute,并且这个 Attribute 继承自抽象类 ActionMethodSelectorAttribute。
那么就好办了。代码如下:
PS:实际运用不建议命名空间这样做(与系统类库或泛用第三方类库重合),假如某一天 MVC 团队真的加了这么一个 Attribute,那么就会编译错误了。这里仅作演示,因为暂时想不到一个好的命名空间。-_-|||
那么,只要打上该 Attribute 的 Action,如果构造函数参数为 true 或调用无参构造函数的话,则请求必须为 AJAX 请求。如果构造函数参数为 false,则不能是 AJAX 请求。
如果上述条件不成立,则返回 404 Not Found。
在 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 Preview 5 体验--实现ActionSelectionAttribute来判断是否为AJAX请求而选择不同的Action
- ASP.NET MVC的Ajax.ActionLink 的HttpMethod="Get" 一个重复请求的BUG
- 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
- 在ASP.NET MVC 中,一个简单的例子让 URL 请求的 controller 和 action 小写
- 在ASP.NET MVC的Controller Action中获取客户端请求数据
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染
- ASP.NET MVC 之Controller & Action (1)
- 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例
- ASP.NET MVC 重点教程一周年版 第十回 请求Controller 【转】
- ASP.NET MVC 重点教程一周年版 第十回 请求Controller
- 返璞归真asp.net mvc 1.0(3) - Controller/Action
- 返璞归真asp.net mvc 1.0(3) - Controller/Action【转】
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
- ASP.NET MVC 入门4、Controller与Action
- [导入]ASP.NET MVC框架开发系列课程(5):控制器(Controller)以及Action.zip(25.35 MB)
- ASP.NET MVC 入门 -- 4、Controller与Action
- asp.net mvc 1.0(5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test(非原创)
- ASP.NET MVC 之Controller & Action (2)
- ASP.NET MVC 入门4、Controller与Action
- ASP.NET MVC 重点教程一周年版 第十回 请求Controller