如何通过自定义特性忽略非Ajax请求下的方法执行?
解决非Ajax请求跳过Action执行的问题
其实很简单,你只需要给filterContext.Result赋值一个合适的ActionResult实现,这样MVC就会直接返回这个结果,跳过后续的Action方法执行。这里有几个实用的方案:
返回403禁止访问(推荐):明确告诉客户端这个接口不允许非Ajax请求访问,语义最准确
using System.Net; using System.Web.Mvc; public class AjaxOnlyAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden); } } }返回404资源未找到:如果不想暴露接口存在的话,可以用这个
filterContext.Result = new HttpNotFoundResult();返回自定义提示内容:如果需要给用户明确的文字提示
filterContext.Result = new ContentResult { Content = "该方法仅支持Ajax请求访问", ContentType = "text/plain", StatusCode = (int)HttpStatusCode.BadRequest };
原理是:当你为filterContext.Result赋值后,MVC的执行流程会直接跳转到结果返回阶段,不会再调用你的AjaxOnlyMethod方法,完美实现“忽略执行”的需求。
内容的提问来源于stack exchange,提问作者Slava Podolskiy
相关产品推荐
相关产品推荐

