Asp.net MVC 应用程序中经常使用ajax操作,一般都是一些action。我们来实现个特性标记当前某个action只支持处理ajax的http请求。 下面直接看代码
/// <summary> /// AjaxOnlyAttribute /// </summary> public class AjaxOnlyAttribute : ActionFilterAttribute { /// <summary> /// Called by the ASP.NET MVC framework before the action method executes. /// </summary> /// <param name="filterContext">The filter context.</param> public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new HttpNotFoundResult(); } base.OnActionExecuting(filterContext); } }
这里让它返回一个特别的HttpNotFoundResult, 以确保代码可读性:
/// <summary> /// HttpNotFoundResult /// </summary> public class HttpNotFoundResult : ActionResult { /// <summary> /// Enables processing of the result of an action method by a custom type that inherits from the <see cref="T:System.Web.Mvc.ActionResult"/> class. /// </summary> /// <param name="context">The context in which the result is executed. The context information includes the controller, HTTP content, request context, and route data.</param> public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("Context"); } context.HttpContext.Response.StatusCode = 401; } }
在Action标记像这样:
[AjaxOnly] public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); }
如何工作的看Unit Test,分别包括了Ajax请求与非Ajax请求的场景.
[TestMethod] public void Test_AjaxOnlyAttributeWithAjaxRequest() { //arrange var header = new System.Collections.Specialized.NameValueCollection(); header.Add("X-Requested-With", "XMLHttpRequest"); var mockRequest = new Mock<HttpRequestBase>(); mockRequest.SetupGet(http => http.Headers).Returns(header); var mockFiltercontext = new Mock<ActionExecutingContext>(); mockFiltercontext.SetupGet(fc => fc.HttpContext.Request).Returns(mockRequest.Object); //act var ajaxAttribute = new AjaxOnlyAttribute(); var filterContext = mockFiltercontext.Object; ajaxAttribute.OnActionExecuting(filterContext); //verify mockRequest.VerifyAll(); //assert Assert.IsTrue(filterContext.HttpContext.Request.IsAjaxRequest()); var httpNotFoundResult = filterContext.Result as Mvc3App.Extention.Attribute.HttpNotFoundResult; Assert.IsNull(httpNotFoundResult); } [TestMethod] public void Test_AjaxOnlyAttributeWithNonAjaxRequest() { //arrange var header = new System.Collections.Specialized.NameValueCollection(); var mockRequest = new Mock<HttpRequestBase>(); mockRequest.SetupGet(http => http.Headers).Returns(header); var mockFiltercontext = new Mock<ActionExecutingContext>(); mockFiltercontext.SetupGet(fc => fc.HttpContext.Request).Returns(mockRequest.Object); var controllerContext = new ControllerContext { RequestContext = new RequestContext(new MockHttpContext(), new RouteData()), HttpContext = new MockHttpContext() }; //act var ajaxAttribute = new AjaxOnlyAttribute(); var filterContext = mockFiltercontext.Object; ajaxAttribute.OnActionExecuting(filterContext); //verify mockRequest.VerifyAll(); //assert Assert.IsFalse(filterContext.HttpContext.Request.IsAjaxRequest()); var httpNotFoundResult = filterContext.Result as Mvc3App.Extention.Attribute.HttpNotFoundResult; Assert.IsNotNull(httpNotFoundResult); httpNotFoundResult.ExecuteResult(controllerContext); Assert.AreEqual(controllerContext.HttpContext.Response.StatusCode, 401); }
MockHttpContext是一个用于Unit Test的类型,由于篇幅有限,这里不讲了。
希望对您Web开发有帮助。
您可能感兴趣文章:
Asp.net MVC3扩展之Ajax异常处理特性
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)