原博文

https://www.cnblogs.com/h82258652/p/3939365.html

代码

/// <summary>
/// 仅允许Ajax操作
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class HandlerAjaxOnlyAttribute: ActionMethodSelectorAttribute
{
/// <summary>
/// 初始化仅允许Ajax操作
/// </summary>
public bool Ignore
{
get;
set;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ignore">是否取消验证,默认false。也就是默认进行验证。</param>
public HandlerAjaxOnlyAttribute(bool ignore = false)
{
Ignore = ignore;
}
/// <summary>
/// 验证请求有效性
/// </summary>
/// <param name="controllerContext"></param>
/// <param name="methodInfo"></param>
/// <returns></returns>
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
if(Ignore) return true;
return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
}
}

Action调用

[HandlerAjaxOnly]
public ActionResult CheckLogin(string loginname, string loginpassword)
{
try
{
T_User user = _iT_UserBLL.CheckLogin(loginname, loginpassword);
return Content("{\"success\":\"1\",\"message\":\"登录成功\"}");
}
catch(Exception ex)
{
return Content("{\"success\":\"0\",\"message\":\"" + ex.Message.ToString() + "\"}");
}
}

原理

(1)首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求。理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的。
在 ajax 请求的请求报文里,往往会包含这么一条:X-Requested-With = XMLHttpRequest
这在各大的 javascript 框架上也是这么做的。

(2)IsValidForRequest 方法返回的是bool类型的值,指示对当前方法访问是否有效。
所以只需要返回对当前方法的访问是否是Ajax请求即可,
而Request类中有扩展方法IsAjaxRequest();,就是返回此状态的。
所以思路就清晰了。
 
(3)ActionMethodSelectorAttribute类源码

// 摘要:
// 表示一个特性,该特性用于影响操作方法的选择。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public abstract class ActionMethodSelectorAttribute: Attribute
{
// 摘要:
// 初始化 System.Web.Mvc.ActionMethodSelectorAttribute 类的新实例。
protected ActionMethodSelectorAttribute();
// 摘要:
// 确定操作方法选择对指定的控制器上下文是否有效。
//
// 参数:
// controllerContext:
// 控制器上下文。
//
// methodInfo:
// 有关操作方法的信息。
//
// 返回结果:
// 如果操作方法选择对指定的控制器上下文有效,则为 true;否则为 false。
public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo);
}

最新文章

  1. c#多线程
  2. JQuery------分页插件下载地址
  3. css鼠标手型cursor中hand与pointer
  4. python--基础学习(六)sqlite数据库基本操作
  5. Navicat for MySQL 工具注册码
  6. MySQL多实例-精典故障案例
  7. 【转】MAC使用adb工具
  8. Bandwidthd+Postgresql数据库配置笔记
  9. TabSpec和TabHost实例
  10. 俄罗斯方块游戏JavaScript代码
  11. Node.js和html数据交互(一) form表单
  12. IntelliJ cannot log in to GitHub上传github报错解决
  13. lua语言三目运算符
  14. [Ting&#39;s笔记Day5]在部署到Heroku之前,将Rails项目从SQLite设定为PostgreSQL
  15. Python-文件操作—_19
  16. python 内置函数enumerate()
  17. [CNN] Face Detection
  18. 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
  19. Discrete Square Roots UVALive - 4270(拓展欧几里得)
  20. UVa 10891 Sum游戏

热门文章

  1. C Looooops POJ - 2115
  2. EDI的五个常见挑战以及如何克服这些挑战
  3. RabbitMQ+Redis模拟手机验证码登录
  4. 【知识点】C/C++编码规范
  5. UML第一次个人作业
  6. 【C++】C++之Lambda表达式
  7. Asp.NetCore之AutoMapper进阶篇
  8. MacOS上Parallels Desktop安装MacOSHighSierra
  9. 使用eslint将项目中的代码修改统一的缩进
  10. 百度前端技术学院-基础-day17-18